2008-09-08 10 views

Antwort

23

Dies ist eine große freie Ressource von Joseph Albahari. Threading in C#

5

Es gibt 4 grundlegende Möglichkeiten Threads in .Net zu synchronisieren:

  • Background Kontrolle
  • waithandles
  • Callback-Funktionen
  • Polling ein asyncResult Objekt

Allgemeinen Sie wollen um an der Spitze dieser Liste zu beginnen und abzuarbeiten. Das bedeutet, zuerst schauen und sehen, ob ein Hintergrundarbeiter-Steuerelement für die Situation geeignet ist. Es wird jedoch ziemlich wahrscheinlich von Windows-Formularen ausgegangen, und Sie erzeugen nur einen neuen Thread.

Also nächste versuchen Waithandles. Waithandles eignen sich gut zum Koordinieren mehrerer Threads. Du kannst sie alle rausschmeißen und warten, bis alle fertig sind, oder wenn du eine bestimmte Zahl aktiv halten willst, dann wartest du nur auf eine und spawne die nächste, wenn sie fertig ist. Oder vielleicht weißt du, dass ein Thread viel früher fertig ist, also kannst du darauf warten, bis er fertig ist, ein wenig Arbeit verrichten und dann warten, bis der Rest fertig ist.

Waithandles scheinen ein wenig zu sein, wenn Sie zum Beispiel nur einen zusätzlichen Thread generieren und nicht blockieren möchten, bis der Vorgang abgeschlossen ist. Dann können Sie einen Rückruf verwenden, so dass die von Ihnen angegebene Funktion aufgerufen wird, sobald der Thread abgeschlossen ist.

Schließlich, wenn und nur wenn aus irgendeinem Grund keiner der oben genannten funktioniert, können Sie zurück auf die Abfrage.

Ich denke, 5 verschiedene Möglichkeiten, wie einen neuen Thread in .Net, auch grob, um zu erhalten:

  • OS erstellt, in der Regel als Folge von WinForms Veranstaltung (einschließlich der BackgoundWorker).
  • Obj.Begin ___()/Ende ____(). In bestimmten CLR-Klassen sind diese asynchronen Methoden bereits für Sie definiert, und Sie möchten diese natürlich verwenden, wenn sie verfügbar sind.
  • ThreadPool.QueueUserWorkItem(). Verwenden Sie die meiste Zeit, um eigene Threads zu erstellen.
  • Delegate.BeginInvoke()/EndInvoke(). Sie können jede Methode auf diese Weise umbrechen.
  • Thread.Start(). Sie könnte tun es so, aber ich lese kürzlich (nicht den Link jetzt), dass, wenn QueueUserWorkItem funktioniert nicht die Delegate-Methode ist wahrscheinlich besser.
1

Eines der besten Ressourcen, die ich über das Thema wissen, ist das "Einfädeln in C#" Buch: http://www.albahari.com/threading/

I hat einen großen Überblick über alle ein .net Entwickler muss verstanden werden, um Multi-Thread-Anwendungen zu programmieren.