2011-05-24 12 views
7

¿Hay una función de espera síncrona que no vincula el hilo de la interfaz de usuario en .NET WPF? Algo así como:Espera sincrónica sin bloquear el UI-Thread

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

en Win32 simple puede usar MsgWaitForMultipleObjects para lograr esto. –

Respuesta

15

Puede utilizar un DispatcherTimer para ese tipo de cosas.

Editar: Esto podría hacerlo tan bien ...

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.)


A partir de .NET 4.5 puede utilizar async controladores de eventos y Task.Delay para obtener el mismo comportamiento. Simplemente, deje que la actualización de la UI durante dicho controlador devuelva Dispatcher.Yield.

+1

En WPF, definitivamente desea utilizar el DispatcherTimer, ya que sus ticks se ejecutarán en el subproceso de la interfaz de usuario permitiéndole modificar los controles de la interfaz de usuario. Si utiliza un temporizador estándar, las marcas se ejecutan en su propio hilo y obtendrá algunas desagradables excepciones si intenta tocar los controles de la interfaz de usuario. +1 – Jay

+0

¿Hay alguna forma de usar el temporizador para hacer las esperas en línea? Parece engorroso y difícil de leer cuando divide un método cada vez que necesita esperar. – PeterM

+1

@PeterM: Como no estoy muy bien versado en temas de enhebrado, es posible que desee echarle un vistazo al [Modelo de subprocesamiento] (http://msdn.microsoft.com/en-us/library/ms741870.aspx) referencia y el método ['Dispatcher.PushFrame'] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx), que podría ayudarlo a simplificar esto. –

Cuestiones relacionadas