Избегать курсора мыши в виде песочных часов при вызове веб-сервиса? - PullRequest
2 голосов
/ 09 июня 2010

Я не знаю, является ли это общей проблемой веб-служб или просто моим конкретным сценарием, который представляет собой приложение WPF с DispatcherTimer, вызывающим метод веб-службы. Каждый раз, когда вызывается таймер, курсор мыши автоматически меняется на курсор в виде песочных часов.

Обработка вызова очень короткая и происходит каждые 3 секунды, поэтому пользовательский опыт заключается в том, что каждые 3 секунды мышь заполняется как песочные часы на долю секунды, а затем возвращается к нормальному представлению курсора.

Как мне избежать этого неудобства?

Спасибо.

1 Ответ

3 голосов
/ 09 июня 2010

Не работает ли все ваше приложение, когда срабатывает таймер, или же весь процесс слишком быстр, чтобы это замечать?

Я предполагаю, что вы можете синхронно вызывать код на DispatcherTimer, что может привести к краткомумоменты безответственности (и, возможно, песочные часы).Чтобы обойти это, убедитесь, что событие Tick вашего Dispatcher имеет асинхронный код.

Вот простой маленький пример, который каждые 3 секунды выполняет секунду поддельной работы, а затем обновляет графический интерфейс:

public partial class MainWindow : Window
{
    private static int foo = 0;

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(3000);
        timer.Tick += new EventHandler(delegate(object o, EventArgs args)
        {
            StatusBox.Text = "Incrementing";

            ThreadStart start = delegate()
            {
                // Simulate work
                Thread.Sleep(1000);

                // Update gui
                this.Dispatcher.BeginInvoke(new Action(delegate
                {
                    CountingBox.Text = (foo++).ToString();
                    StatusBox.Text = "Waiting";
                }));
            };

            new Thread(start).Start();                
        });

        timer.Start();
    }
}

(Существуют и другие методы для достижения тех же целей, этот способ можно было легко отработать. Более подробную информацию см. В руководстве здесь: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)

...