Führt BeginInvoke () einen separaten Thread aus?

8

In meiner WPF-Anwendung möchte ich in einem Nicht-UI-Thread arbeiten, um zu vermeiden, dass die Benutzeroberfläche nicht mehr reagiert. Dafür habe ich folgendes getan:

%Vor%

Und der Delegat ist definiert als

%Vor%

Meine Frage ist:

Erstellt BeginInvoke() einen neuen Thread und der Callback SetPatternType läuft darin? Wenn ja, wie lange dauert dieser Thread?

Ist diese Vorgehensweise generell gut? Wenn nicht, was ist daran falsch? Und welche potentiellen Probleme könnte ich haben?

Ich verwende C # 4.0 und Visual Studio 2010.

BEARBEITEN:

Ich brauche auch einige Richtlinien in Bezug auf diese:

Wenn ich selbst einen neuen Thread erstellen soll und wann sollte ich BeginInvoke() verwenden? Und wann sollte ich DispatcherObject.Dispatcher.BeginInvoke() object verwenden?

    
Nawaz 07.04.2011, 08:06
quelle

3 Antworten

11

Es ist technisch not a new thread es ist ein Threadpool-Thread, und es migth dauert länger als Ihr Prozess / Programm, aber möglicherweise einige andere Threads Asynch-Aufrufe sofort ausgeführt, wenn Sie Ihre beendet. Überprüfen Sie MSDN-Artikel auf Asynch Programming und Threadpool um die vollständigen Details zu erhalten.

Und je nach Interesse prüfen Sie I / O CompletionPort , um weitere Informationen zu erhalten Einzelheiten.

Asynch-Programmierung wird im Allgemeinen als besser als zumindest synchroner Code angesehen, aber wenn Sie auf .NET 4.0 sind, schauen Sie sich Aufgabe parallele Bibliothek .

Basierend auf der Fragebearbeitung, wann sollte ich meinen eigenen Thread erstellen? Es ist immer besser, BeginInvoke oder Async-Programmierung zu verwenden, als einen eigenen Thread zu erstellen. Erstellen Sie einen eigenen Thread, wenn Sie sicher sind, dass Sie einen dedizierten Thread benötigen, der eine Aufgabe / Arbeit kontinuierlich ausführt, und dass Sie sich über die Synchronisationsmechanismen im Klaren sind, die von mehreren Threads in Ihrer Anwendung benötigt werden. Vermeiden Sie so lange wie möglich neue Threads zu erstellen, es sei denn, Sie haben einen wirklich zwingenden Grund. Du fügst heute einen Thread hinzu und gehst wahrscheinlich weiter und nach zwei Jahren sehen drei Entwickler, dass ein zusätzlicher Thread für einige fortlaufende Sachen hinzugefügt wurde, sie werden einige mehr hinzufügen und so weiter. Vertrauen Sie mir, ich habe das beobachtet, deshalb setzen Sie die richtigen Praktiken (zB Asynch-Methoden) und die Leute werden versuchen, dem zu folgen. Ich habe Anwendungen mit 150 Threads gesehen, macht das auf einem Dual-Core- oder Quad-Core-Rechner Sinn, glaube ich nicht.

Habe gerade alle laufenden Prozesse auf meinem Toshiba-Laptop nach solchen schlecht entworfenen Apps überprüft, Toshiba Bluetooth Manager gewinnt die Krone des am schlechtesten entworfenen Programms auf meiner Box mit 53 Threads. :)

    
Sanjeevakumar Hiremath 07.04.2011, 08:12
quelle
8

Er verwendet den Thread-Pool - er wird also nicht unbedingt einen neuen Thread erstellen, sondern er wird in einem anderen Thread als der aufrufende Thread ausgeführt (es sei denn, es handelt sich um einen Thread-Thread selbst , der beendet wird) seine Aufgabe vor dem Delegiertenaufruf ist geplant, es wäre ziemlich unwahrscheinlich, den gleichen Thread zu verwenden).

    
Jon Skeet 07.04.2011 08:11
quelle
3

Dispatcher.CurrentDispatcher ist ein neuer Zeugs in WPF (Art von InvokeRequired Zeug in WinForms ersetzt).

Sie können den Dispatcher verwenden, um alle Aktualisierungen, die Sie möchten, in die GUI einzuordnen, und es gibt verschiedene Prioritäten, aus denen Sie wählen können

Siehe diese MSDN-Verknüpfung

    
Bek Raupov 07.04.2011 11:17
quelle