2012-09-03 14 views
10

VB6 aveva un metodo DoEvents() chiamato per restituire il controllo al sistema operativo e imitare il comportamento multi-thread in quell'ambiente con singolo thread.Equivalente C# di VB 6 DoEvents

Qual è l'equivalente del framework .NET di VB 6 DoEvents()?

+1

Penso che stiate pensando a Doevents. Il rendimento è un metodo .NET utilizzato nella gestione delle enumerazioni. E l'equivalente in .NET è Application.DoEvents() (indipendentemente dalla lingua utilizzata) – Zippit

+2

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

+0

@Marlon: Capisco. In realtà ricordo di aver fatto questa domanda ogni pochi anni. Non ricordo quando l'ho chiesto per ultimo. Potresti avere ragione e quella potrebbe essere la risposta, ma la mia memoria non mi soddisfa. Sto anche pensando di aver trovato un sostituto in uno dei metodi della classe System.Diagnostics.Process ma non riesco a ricordare con certezza. –

risposta

8

Application.DoEvents() (parte di WinForms)

+0

Che dire di WPF? Odio WinForms –

+3

@ColeJohnson Il vecchio metodo Application.DoEvents() è stato sottratto in WPF a favore dell'utilizzo di [* Dispatcher *] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) oppure [* Background Worker Thread *] (http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/) a fai l'elaborazione come hai descritto. Vedi i collegamenti per un paio di articoli su come utilizzare entrambi gli oggetti. –

+0

In generale, non consiglio comunque di utilizzare DoEvents. Può fermare una GUI. Google problemi di Application.DoEvents –

23

è possibile utilizzare Application.DoEvents(). Perché non utilizzare la classe Threading o semplicemente Background Workers? Se stai facendo in ambiente .net, non usare DoEvents. Lasciare su VB6.

1

Se si chiama Application.DoEvents() nel codice, l'applicazione può gestire gli altri eventi. Ad esempio, se si dispone di un modulo che aggiunge dati a un ListBox e si aggiunge DoEvents al codice, il modulo viene ripristinato quando viene trascinata su un'altra finestra. Se rimuovi DoEvents dal tuo codice, il tuo modulo non verrà ridisegnato finché il gestore di eventi click del pulsante non ha completato l'esecuzione. Per ulteriori informazioni sulla messaggistica, vedere Input utente in Windows Form.

A differenza di Visual Basic 6.0, il metodo DoEvents non chiama il metodo Thread.Sleep.

5

Il seguente è un metodo generale DoEvents tipo

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; 
    } 
} 
} 

Non ha bisogno di sapere circa l'applicazione.