2008-09-17 11 views
15

Ereignisse sind in C# synchron. Ich habe diese Anwendung, wo mein Hauptformular einen Thread mit einer Schleife darin beginnt, die auf einen Strom hört. Wenn etwas im Stream kommt, wird ein Event von der Schleife zum Hauptformular ausgelöst.Die beste Möglichkeit, um Ereignisse in C# asynchron zu machen #

Wenn das Hauptformular ist langsam oder zeigt eine Messagebox oder etwas die Schleife wird ausgesetzt. Was ist der beste Weg? Mit einem Callback und Aufruf auf dem Hauptformular?

Antwort

3

Hmmm, ich habe verschiedene Szenarien verwendet, die davon abhängen, was ich zu der Zeit brauchte.

Ich glaube, die BeginInvoke wäre wahrscheinlich am einfachsten zu codieren, da Sie fast da sind. In beiden Fällen sollten Sie Invoke bereits verwenden, also nur zu BeginInvoke wechseln. Wenn Sie einen Callback für einen separaten Thread verwenden, erreichen Sie dasselbe (wenn Sie den Threadpool verwenden, um den Rückruf in eine Warteschlange zu stellen), indem Sie BeginInvoke verwenden.

+0

Dies passte am besten zu meiner Anwendung, die Schleife in einen Hintergrundarbeiter zu werfen passt nicht ganz so, wie ich das handhaben möchte. –

+0

Vergessen Sie nicht, auch EndInvoke zu verwenden, da sonst keine Ausnahme von den aufgerufenen Methoden ausgelöst wird. – dmigo

8

Da Sie ein Formular verwenden, ist es einfacher, die Komponente BackgroundWorker zu verwenden.

Die Background Klasse ermöglicht Sie eine Operation auf einem separaten, dedizierten Thread ausgeführt. Zeitaufwendige Transaktionen wie Downloads und Datenbank Transaktionen können dazu führen, dass Ihr Benutzer Schnittstelle (UI) scheint, als ob es nicht mehr reagiert, während sie ausgeführt werden. Wenn Sie eine reaktionsfähige Benutzeroberfläche möchten und Sie mit langen Verzögerungen im Zusammenhang mit solchen Operationen konfrontiert sind, bietet die BackgroundWorker-Klasse eine bequeme Lösung.

+0

Ich muss zustimmen, ein BackgroundWorker ist der netteste und sauberste Weg. –

0

Sie haben ein paar Optionen, wie bereits ausführlich beschrieben, aber meiner Erfahrung nach sind Sie besser Delegationen und BeginInvoke verlassen und stattdessen BackgroundWorker verwenden (v2.0 +), da es einfacher zu verwenden ist Außerdem können Sie mit dem Hauptformular bei der Fertigstellung des Threads interagieren. Alles in allem eine sehr gelungene Lösung, die ich gefunden habe.

0

System.ComponentModel.BackgroundWorker ist in der Tat ein guter Ausgangspunkt. Es führt Ihre asynchrone Arbeit durch, benachrichtigt Sie über wichtige Ereignisse und bietet Möglichkeiten zur besseren Integration in Ihre Formulare.

Zum Beispiel können Sie Fortschrittsbenachrichtigungen aktivieren, indem Sie einen Handler für das ProgressChanged-Ereignis registrieren. (was sehr zu empfehlen ist, wenn Sie einen langen, asynchronen Prozess haben und nicht möchten, dass Ihr Benutzer denkt, die Anwendung sei eingefroren)