2012-09-03 14 views
10

VB6 miał metodę DoEvents(), którą wywołano, aby przywrócić kontrolę do systemu operacyjnego i naśladować zachowanie wielowątkowe w tym środowisku z pojedynczym wątkiem.C# Równoważnik VB 6 DoEvents

Co to jest odpowiednik platformy .NET VB 6 DoEvents()?

+1

Myślę, że myślisz o Doevents. Yield to metoda .NET używana do obsługi wyliczeń. Odpowiednikiem w .NET jest Application.DoEvents() (niezależnie od języka) – Zippit

+2

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

+0

@Marlon: Rozumiem. Właściwie to pamiętam zadawanie tego pytania co kilka lat. Nie pamiętam, kiedy go zapytałem. Możesz mieć rację i to może być odpowiedź, ale moja pamięć zawodzi mnie. Myślę również, że znalazłem substytut w jednej z metod klasy System.Diagnostics.Process, ale nie pamiętam na pewno. –

Odpowiedz

8

Application.DoEvents() (część WinForms)

+0

Co z WPF? Nienawidzę WinForms –

+3

@ColeJohnson Stara metoda Application.DoEvents() została zdyskredytowana w WPF na korzyść użycia [* Dispatchera *] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) lub [* Background Worker Thread *] (http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/) na wykonaj przetwarzanie zgodnie z opisem. Zobacz linki do kilku artykułów na temat korzystania z obu obiektów. –

+0

Generalnie nie polecam używania DoEvents w każdym razie. Może zatrzymać GUI. Problemy Google Application.DoEvents –

23

można użyć Application.DoEvents(). Dlaczego nie używać klasy Threading lub po prostu Background Workers? Jeśli robisz środowisko .net, nie używaj DoEvents. Pozostaw to na VB6.

1

Jeśli wywołasz Application.DoEvents() w kodzie, aplikacja może obsłużyć inne zdarzenia. Na przykład, jeśli masz formularz, który dodaje dane do ListBox i dodaje DoEvents do twojego kodu, twoja forma odświeża się, gdy inne okno zostanie przeciągnięte nad nią. Jeśli usuniesz DoEvents z kodu, formularz nie będzie odświeżany, dopóki nie zakończy się wykonywanie funkcji obsługi zdarzeń kliknięcia przycisku. Aby uzyskać więcej informacji na temat wiadomości, zobacz Wprowadzanie użytkownika w Windows Forms.

W przeciwieństwie do Visual Basic 6.0, metoda DoEvents nie wywołuje metody Thread.Sleep.

5

Poniżej przedstawiono ogólny sposób DoEvents typ

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

To nie musi wiedzieć o aplikacji.