2011-05-24 116 views
7

是否有一个同步等待函数不会绑定.NET WPF中的UI线程?例如:不阻塞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 
+0

在纯Win32中你可以使用MsgWaitForMultipleObjects来实现这一点。 – 2011-05-24 23:10:23

回答

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

在WPF中,您很想使用DispatcherTimer,因为它的ticks将在UI线程上执行,使您能够修改UI控件。如果您使用标准计时器,则tick会在其自己的线程上执行,如果您尝试触摸UI控件,将会遇到一些令人讨厌的异常。 +1 – Jay 2011-05-24 21:50:54

+0

是否有使用计时器进行内联等待。每当你需要等待时,当你分解一个方法时,看起来很繁琐而难以阅读。 – PeterM 2011-05-24 21:58:49

+1

@PeterM:因为我不太熟悉线程问题,所以您可能需要查看[线程模型](http://msdn.microsoft.com/zh-cn/library/ms741870.aspx)参考和['Dispatcher.PushFrame'](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatcher.pushframe.aspx)方法,这可能有助于您简化此操作。 – 2011-05-24 22:27:54