Unterschied zwischen BeginInvoke und Thread.Start
Ich habe einen dialog basierte Anwendung, in der ich die übertragung der I/O-Operationen Lesen, schreiben anderen thread.
Ich will nur klar ist, gibt es einen Unterschied zwischen den beiden Ansätzen..
Erster Ansatz: ( ich Tue dies ,meine Haupt-form -Form.cs)
delegate void Action();
Action _action = new Action(Method);
this.BeginInvoke(_action);
Zweiter Ansatz:
Thread th = new Thread( new ThreadStart(_action));
th.Start();
Bemerkte ich, dass BeginInvoke hängt die UI für eine Sekunde, während der zweite Ansatz nicht ..
Bitte helfen
InformationsquelleAutor der Frage Ashish Ashu | 2009-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
BeginInvoke
post wird die Aktion in der message-queue der message-pump, die auf dem gleichen thread wie dieForm
es wird nicht einen neuen thread erstellen.Control.BeginInvoke
verhält sich ähnlich wie ein asynchroner thread starten, aber hat wichtige interne Unterschiede.Lesen Sie weitere Details ein Artikel hier.
InformationsquelleAutor der Antwort Kenan E. K.
BeginInvokes führt den Delegaten asynchron im UI-thread (was ist warum hängt sich die UI), durch eine Nachricht an das Fenster. Das ist, was Sie tun müssen, wenn Sie den code in der Stellvertretung greift auf die UI.
Den Ansatz mit Gewinde.Start führt die Delegierten auf einen neuen, unabhängigen thread.
InformationsquelleAutor der Antwort Thomas Levesque
Thread.Start
läuft es auf dem neuenThread
.Control.BeginInvoke
läuft die Methode auf den thread, der die Kontrolle dieses gehört. Wenn Sie derzeit auf dem Gewinde der Kontrolle, die Methode wird nicht ausgeführt, bis Sie die Steuerung wieder an die message-loop, z.B. beenden Sie Ihren event-handler.InformationsquelleAutor der Antwort Timbo
Versuchen.
Über BeginInvoke(), es ist verwendet so wird die Funktion sofort zurück und die nächste Zeile wird ausgeführt und so weiter und so Fort, ohne zu warten, für die Methode fertig stellen.
Der Unterschied ist, dass wenn du einen thread erstellst, haben Sie mehr Kontrolle über Sie, genau wie jeder andere thread. Sie laufen in CrossThreadExceptions! In der Erwägung, dass, wenn Sie IAsyncResult-und BeginInvoke(), werden Sie nicht die Kontrolle über die Ausführung Fluss der asynchrone Betrieb, wie es gelungen ist, von der Laufzeit.
Mit Aufruf-Sie können auch senden Sie mehrere Parameter an eine Methode und eine Methode wird aufgerufen, nachdem die operation beendet ist.
Habe ich weit verbreitet, sowohl für die UI-Entwicklung. Ich würde threads mehr für den service-wie Objekte. (Denken Sie an ein Objekt, das bleibt und wartet auf TCP-verbindungen) und asynchrone Methoden für die hintergrund-Arbeit hinter einem UI (BackgroundWorker).
Keine Sorge, wenn der erste Ansatz nahm eine zusätzliche Sekunde, um zu starten: Thread.Abort() ist nicht
immer die beste Lösung. Versuchen _abort Flaggen in Ihre Prozess-code und verriegeln Sie es.
Hoffe, ich habe die Frage beantwortet.
Bruzzaniti Leo
InformationsquelleAutor der Antwort lb.
Als andere haben gepostet, Thread.Start startet einen neuen thread und Kontrolle.BeginInvoke() wird die Ausführung von code auf dem UI-thread (erforderlich, wenn Sie ein Feld ändern möchten, die den Wert, zum Beispiel).
Allerdings habe ich festgestellt, dass die einfachste Technik für die Ausführung einer Hintergrundaufgabe in WinForms ist die Verwendung eines BackgroundWorker. Sie legen Sie es auf einem Formular, Draht, Veranstaltungen, und rufen Sie runworkerasync erfasst(). Dann schreiben Sie Ihre hintergrund-task in der DoWork-Ereignis. Die Benutzeroberfläche aktualisieren kann sein das RunWorkerCompleted-Ereignis.
Mit einem BackgroundWorker-vermeidet die lästigen thread-Verarbeitung und IsInvokeRequired Zeug.
Hier ist eine detailliertere how-to-Artikel.
InformationsquelleAutor der Antwort Don Kirkby
wäre der Unterschied, dass die BeginInvoke-Methode ruft einfach den Delegaten asynchron auf dem GLEICHEN thread.
Über das Gewinde.Starten, werden Sie ein ganz anderer thread.
Thread.Starten wird definitiv geben Sie eine bessere Leistung!
InformationsquelleAutor der Antwort Sk93