Синхронное ожидание без блокировки потока пользовательского интерфейса - PullRequest
7 голосов
/ 25 мая 2011

Есть ли синхронная функция ожидания, которая не связывает UI-поток в .NET WPF? Что-то вроде:

Sub OnClick(sender As Object, e As MouseEventArgs) Handles button1.Click
     Wait(2000) 
     'Ui still processes other events here
     MessageBox.Show("Is has been 2 seconds since you clicked the button!")
End Sub

Ответы [ 2 ]

16 голосов
/ 25 мая 2011

Вы можете использовать DispatcherTimer для такого рода вещей.

Редактировать: Это может также подойти ...

private void Wait(double seconds)
{
    var frame = new DispatcherFrame();
    new Thread((ThreadStart)(() =>
        {
            Thread.Sleep(TimeSpan.FromSeconds(seconds));
            frame.Continue = false;
        })).Start();
    Dispatcher.PushFrame(frame);
}

(Dispatcher.PushFrame документация. )


Начиная с .NET 4.5 вы можете использовать async обработчики событий и Task.Delay, чтобы получить такое же поведение.Чтобы просто позволить обновлению пользовательского интерфейса во время такого обработчика вернуть Dispatcher.Yield.

0 голосов
/ 13 июля 2018

Вот решение с Task.Delay. Я использую его в юнит-тестах для ViewModel s, которые используют DispatcherTimer.

var frame = new DispatcherFrame();

var t = Task.Run(
    async () => {
        await Task.Delay(TimeSpan.FromSeconds(1.5));
        frame.Continue = false;
    });

Dispatcher.PushFrame(frame);

t.Wait();
...