Ich habe ein grundlegendes Verständnis für Multithreading als Informatik-Hauptfach, habe aber noch nie etwas über einfache Timer in einer Anwendung hinaus gemacht. Kennt jemand eine gute Ressource, die mir eine Einführung gibt, wie man mit Mehrprozessanwendungen arbeitet, die die Grundlagen erklärt und vielleicht auch einige schwierigere Themen behandelt?
Antworten
Zu viele Anzeigen?Dies ist ein großartiger kostenloser Ressource von Joseph Albahari. Multithreading in C#
Zwei großartige Artikel:
Was jeder Entwickler über Multithread-Apps wissen muss
Verstehen Sie die Auswirkungen von Low-Lock-Techniken bei Multithread-Apps
Obwohl dieser Artikel nicht genau das ist, was Sie speziell suchen, hoffentlich wird er Ihnen allgemein behilflich sein (d.h. er ist relevant und sehr lesenswert):
Das Gratis-Mittagessen ist vorbei: Eine grundlegende Wende hin zur Parallelität in Software
Es gibt 4 grundlegende Möglichkeiten, Threads in .Net zu synchronisieren:
- BackgroundWorker-Steuerelement
- WaitHandles
- Callback-Funktionen
- einen ASyncResult-Objekt abfragen
Im Allgemeinen möchten Sie mit dieser Liste von oben nach unten vorgehen. Das bedeutet, dass Sie zuerst prüfen, ob ein BackgroundWorker-Steuerelement für die Situation geeignet ist. Es wird jedoch vorausgesetzt, dass es sich weitgehend um Windows Forms handelt und dass Sie nur einen neuen Thread erstellen.
Dann versuchen Sie WaitHandles. WaitHandles eignen sich gut, um mehrere Threads zusammenzuführen. Sie können sie alle starten und auf deren Abschluss warten, oder wenn Sie eine bestimmte Anzahl aktiv halten möchten, warten Sie nur auf einen und starten den nächsten, wenn er fertig ist. Oder vielleicht wissen Sie, dass ein Thread viel früher fertig wird, sodass Sie auf dessen Abschluss warten, etwas Arbeit erledigen und dann auf den Abschluss der anderen warten können.
WaitHandles scheinen vielleicht etwas übertrieben zu sein, wenn Sie beispielsweise nur einen zusätzlichen Thread starten und nicht darauf warten möchten, dass er fertig wird. Dann könnten Sie einen Callback verwenden, sodass die von Ihnen festgelegte Funktion sofort aufgerufen wird, sobald der Thread abgeschlossen ist.
Schließlich, und nur wenn aus irgendeinem Grund keines der oben genannten Verfahren funktioniert, können Sie sich auf das Polling zurückziehen.
Ich kann 5 verschiedene Möglichkeiten zum Erstellen eines neuen Threads in .Net nennen, ebenfalls ungefähr in dieser Reihenfolge:
- Von dem Betriebssystem erstellt, normalerweise als Ergebnis eines Winforms-Ereignisses (einschließlich des BackgroundWorkers).
- Obj.Begin___()/End____(). Bestimmte CLR-Klassen haben bereits diese asynchronen Methoden für Sie definiert, und offensichtlich möchten Sie sie verwenden, wenn sie verfügbar sind.
- ThreadPool.QueueUserWorkItem(). Verwenden Sie dies die meiste Zeit, um Ihre eigenen Threads zu erstellen.
- Delegate.BeginInvoke()/EndInvoke(). Sie können auf diese Weise jede Methode umwickeln.
- Thread.Start(). Sie könnten es auf diese Weise machen, aber ich habe kürzlich etwas gelesen (habe den Link jetzt nicht), dass wenn QueueUserWorkItem nicht funktioniert, die Delegatenmethode wahrscheinlich besser ist.
Eine der besten Ressourcen, die ich zum Thema kenne, ist das Buch "Threading in C#": http://www.albahari.com/threading/
Es bietet eine großartige Übersicht über alles, was ein .NET-Entwickler verstehen muss, um Multi-Thread-Anwendungen zu programmieren.