2011-02-12 12 views
7

¿Es Application.DoEvents() solo para formularios?¿Es Application.DoEvents() solo para WinForms?

Pensé que este comando se utilizaba para garantizar que todos los comandos anteriores se procesaran pero ahora, después de leer the documentation, ya no estoy seguro.

+4

Realmente no debería necesitar usar 'Application.DoEvents'. ¿Que problema estas tratando de resolver? Quizás alguien pueda sugerir una mejor manera de hacerlo. –

+0

No es solo 'DoEvents'. Es toda la clase. Es por eso que es 'System.Windows.Forms.Application' ... – Timwi

Respuesta

14

Sí, está realmente dirigido a Windows Forms. Sin embargo, en mi opinión debería evitarse siempre que sea posible.

Generalmente se utiliza como un hack para los desarrolladores que no quieren molestarse en poner las operaciones de larga duración en un hilo diferente ... pero eso significa que están presentando problemas de reincorporación que pueden ser muy difíciles de rastrear, así como seguir bloqueando el hilo de la interfaz de usuario durante algún tiempo (y si eso incluye algo así como una operación de archivo, no se puede predecir si la operación se completará lo suficientemente rápido como para que el usuario no tenga un efecto visible).

+1

+1000, no solo en su opinión. Realmente no hay razón para usarlo en absoluto. –

+0

'DoEvents' puede ser útil para implementar una operación de bloqueo como' MessageBox'. – Vlad

+0

@Vlad: Creo que es mejor desactivar el resto de la entrada de UI. De lo contrario, su DoEvents aún puede significar que el resto de la interfaz de usuario comienza a responder cuando usted no lo desea. –

3

Sin WinForms, no hay cola de eventos estándar. (Bueno, hay una cola de eventos en WPF, pero este es solo otro marco).

+0

¿Qué quiere decir con "esto es solo otro marco"? –

+0

@Cody: Significa que un programa C# no es necesariamente un programa WinForms o WPF. WPF es un marco construido en la parte superior de C# (y también lo es WinForms).Las colas de eventos estarán disponibles solo si usa algunos de los marcos, por ejemplo, WinForms o WPF, pero no de forma predeterminada. – Vlad

+0

Claro. Pero no es ASP.NET (por ejemplo) * también * ¿un marco? 'DoEvents' no tiene mucho sentido allí. –

2

Sí, es solo para Windows Forms. No tendría sentido en una consola o aplicación ASP.NET, porque no hay ningún bucle de mensaje. Es posible hacerlo en WPF, utilizando el despachador, como se muestra en here. De todos modos, no recomendaría usar DoEvents excepto tal vez en una aplicación rápida y sucia, por las razones explicadas por Jon.

3

Si lo que estamos tratando de lograr es la espera de que pase algo fuera de su aplicación (por ejemplo. Un archivo que se cayó en un determinado directorio), una posible solución sería la clasetemporizador de los System.Timers espacio de nombres.

Un ejemplo (basado en MSDN):

Private Sub SetTimer() 
    Dim aTimer As New System.Timers.Timer 
    AddHandler aTimer.Elapsed, AddressOf OnTimedEvent 
    aTimer.Interval = 5000 
    aTimer.Enabled = True 

    Console.WriteLine("Press q to exit") 
    While Console.Read <> Asc("q") 
    End While 
End Sub 

Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs) 
    'Do the job here 
    Console.WriteLine("HELLO WORLD!") 
    'Don't forget to disable the timer if you don't need it anymore 
    'Source.Enabled = False 
End Sub 

Más información en MSDN: http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx

Cuestiones relacionadas