2012-09-03 49 views
10

VB6 tenía un método DoEvents() al que llamó para devolver el control al sistema operativo e imitar el comportamiento de subprocesos múltiples en ese entorno de subproceso único.C# Equivalente de VB 6 DoEvents

¿Cuál es el equivalente de .NET framework de VB 6 DoEvents()?

+1

Creo que estás pensando en Doevents. El rendimiento es un método .NET utilizado en el manejo de la enumeración. Y el equivalente en .NET es Application.DoEvents() (independientemente del idioma utilizado) – Zippit

+2

'Application.DoEvents() == DoEvents'? – Marlon

+0

@Marlon: Ya veo. En realidad, recuerdo haber hecho esta pregunta cada pocos años. No puedo recordar cuándo lo pregunté al último. Podrías tener razón y esa podría ser la respuesta, pero mi memoria me falla. También estoy pensando que encontré un sustituto en uno de los métodos de la clase System.Diagnostics.Process, pero no puedo recordarlo con certeza. –

Respuesta

8

Application.DoEvents() (parte de Windows Forms)

+0

¿Qué hay de WPF? Odio WinForms –

+3

@ColeJohnson El antiguo método Application.DoEvents() ha sido privado en WPF a favor de usar un [* Dispatcher *] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) o un [* Subproceso Trabajador de Fondo *] (http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/) para haz el procesamiento como lo has descrito. Vea los enlaces de un par de artículos sobre cómo usar ambos objetos. –

+0

En general, no recomiendo usar DoEvents de todos modos. Puede detener una GUI. Problemas de Google de Application.DoEvents –

23

puede utilizar Application.DoEvents(). ¿Por qué no utilizar Threading clase o simplemente Background Workers? Si lo está haciendo en un entorno .net, no use DoEvents. Déjalo en VB6.

1

Si llama a Application.DoEvents() en su código, su aplicación puede manejar los otros eventos. Por ejemplo, si tiene un formulario que agrega datos a un ListBox y agrega DoEvents a su código, su formulario se vuelve a pintar cuando se arrastra otra ventana sobre él. Si elimina DoEvents de su código, su formulario no se volverá a pintar hasta que el controlador de evento click del botón termine de ejecutarse. Para obtener más información sobre mensajes, vea Entrada de usuario en Windows Forms.

A diferencia de Visual Basic 6.0, el método DoEvents no llama al método Thread.Sleep.

5

El siguiente es un método de tipo general, DoEvents

using System; 
using System.Windows.Threading; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Permissions; 

namespace Utilites 
{ 
/// <summary> 
/// Emulates the VB6 DoEvents to refresh a window during long running events 
/// </summary> 
public class ScreenEvents 
{ 
    [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
    public static void DoEvents() 
    { 
     DispatcherFrame frame = new DispatcherFrame(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
      new DispatcherOperationCallback(ExitFrame), frame); 
     Dispatcher.PushFrame(frame); 
    } 

    public static object ExitFrame(object f) 
    { 
     ((DispatcherFrame)f).Continue = false; 

     return null; 
    } 
} 
} 

No necesita saber acerca de la aplicación.