同步等待而不阻止UI线程

时间:2011-05-24 21:45:03

标签: .net wpf vb.net multithreading wait

是否有一个同步等待函数不会占用.NET WPF中的UI线程?类似的东西:

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 个答案:

答案 0 :(得分:15)

你可以使用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 documentation.


从.NET 4.5开始,您可以使用async事件处理程序和Task.Delay来获得相同的行为。在这样的处理程序中简单地让UI更新返回Dispatcher.Yield

答案 1 :(得分:0)

这是Task.Delay的解决方案。我在使用ViewModel的{​​{1}}的单元测试中使用它。

DispatcherTimer