Frage

Ereignisse sind in C#synchron. Ich habe diese Anwendung, bei der mein Hauptformular einen Thread mit einer Schleife startet, die auf einen Stream hört. Wenn etwas auf dem Stream kommt, wird ein Ereignis aus der Schleife auf die Hauptform abgefeuert.

Wenn das Hauptformular langsam ist oder eine MessageBox oder etwas anzeigt, wird die Schleife suspendiert. Was ist der beste Weg? Durch die Verwendung eines Rückrufs und aufgerufen auf das Hauptformular?

War es hilfreich?

Lösung

Hmmm, ich habe verschiedene Szenarien verwendet, die von dem abhing, was ich damals brauchte.

Ich glaube, der Beginninvoke wäre wahrscheinlich am einfachsten zu codieren, da Sie fast da sind. In beiden Fällen sollten Sie Invoke bereits verwenden, also wechseln Sie einfach, um zu beginnen. Wenn Sie einen Rückruf in einem separaten Thread verwenden, wird dieselbe Sache (solange Sie mit dem Threadpool die Rückruf anstellen) wie mit Beginninvoke erreicht.

Andere Tipps

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

Mit der Hintergrundworker -Klasse können Sie einen Vorgang auf einem separaten, dedizierten Thread ausführen. Zeitaufwändige Vorgänge wie Downloads und Datenbanktransaktionen können dazu führen, dass Ihre Benutzeroberfläche (Benutzeroberfläche) so aussieht, als ob sie während des Ausführens nicht mehr reagieren würde. Wenn Sie eine reaktionsschnelle Benutzeroberfläche wünschen und mit langen Verzögerungen mit solchen Operationen konfrontiert sind, bietet die Hintergrundarbeitskurs eine bequeme Lösung.

Ereignisse sind gerecht Delegierte, verwenden Sie also beginnen Sie mit Startinvoke. (sehen Asynchrone Methodenaufrufe in der .NET -Umgebung machen)

Sie haben einige Optionen, wie bereits detailliert, aber meiner Erfahrung nach sind Sie besser dran, Delegierten zu verlassen und anzumachen und stattdessen Hintergrundworker (v2.0+) zu verwenden, da es einfacher zu verwenden ist und Sie auch mit dem interagieren können Hauptformular für die Fertigstellung des Threads. Alles in allem eine sehr weel implementierte Lösung, habe ich festgestellt.

System.comPonentModel.Backgroundworker ist in der Tat ein guter Ausgangspunkt. Es wird Ihre asynchrone Arbeit erledigen, Ihnen Benachrichtigungen über wichtige Ereignisse geben und Möglichkeiten haben, sich besser in Ihre Formulare zu integrieren.

Sie können beispielsweise Fortschrittsbenachrichtigungen aktivieren, indem Sie einen Handler für das Fortschrittsfordered -Ereignis registrieren. (Was dringend empfohlen wird, wenn Sie einen langen, asynchronen Prozess haben und Ihr Benutzer nicht denkt, dass die Anwendung gefroren ist)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top