2009-06-03 10 views
2

Gibt es eine elegante Möglichkeit zu wissen, wann ein Worker-Thread ausgeführt wird, damit ich auf die von ihm produzierten Ressourcen zugreifen kann?Wie kann ich feststellen, ob ein Thread fertig ist, ohne ThreadState abzufragen?

Zum Beispiel, wenn der Arbeiter-Thread eine Liste von SQL Server abgefragt mit

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

und rettete das Ergebnis in einem Datatable-Variable, welcher Mechanismus kann ich wissen, verwenden, wenn diese Datentabelle Variable gefüllt wurde/ist verfügbar. Ich möchte ThreadState nicht abfragen; Es wäre ideal ein Ereignis auszulösen, wenn es fertig ist, also kann ich mit dem Ergebnis Aktionen ausführen.

Danke!

Antwort

5

Sie einen Rückruf-Mechanismus oder Block auf einer Veranstaltung der Fertigstellung eines Async Betrieb wissen können . Sehen Sie sich diese Seite für die Asychronous Programming Model in .net an - Sie können BeginInvoke für jeden Delegaten aufrufen, um die Aktion asynchron auszuführen. Wenn Sie den Typ BackgroundWorker verwenden, können Sie die RunWorkerCompleted event abonnieren.

+0

+1 Ooh, sehr nett!Ich überprüfe gerade den Link für das asynchrone Programmiermodell und kann eines der dort aufgeführten Beispiele verwenden. Vielen Dank!! – Pwninstein

1

So ein Ereignis ausgelöst :-P

Sie auch bei Verwendung eines Autoreset aussehen könnte:
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

+0

Das würde erfordern eine Art von Abfragen, die ich versuche zu vermeiden. Ich bin auf der Suche nach einer Lösung, die Thread-Erstellung, -Ausführung und -Benachrichtigung kapselt. Einen Thread abbrechen zu können, ist ebenfalls eine Notwendigkeit. – Pwninstein

+0

+1 für die "so ein Ereignis auslösen" Kommentar – ChrisF

0

Ich programmiere nicht in C#, aber hier ist, was ich mit Delphi gemacht habe, vielleicht können Sie es auch mit C# tun. Ich habe einen TThread-Nachkomme, und im "destroy" -Ereignis sende ich eine Nachricht an den Ersteller: "Hey, ich bin im Begriff zu sterben!". Auf diese Weise erstellt sein Parent (der der Hauptthread ist) einen neuen, wenn er einen neuen benötigt. Um genau zu sein, es startet einen Timer, der, wenn gefeuert wird, einen neuen Thread erstellt, wenn ein neuer benötigt wird (Seiten saugen Zeit (lol) !!).

1

Was ich in diesem Fall mache, ist, dass der WorkerThread eine Funktion aufruft, nachdem er die Arbeit beendet hat, wodurch der UI-Thread aufgerufen wird, der die Arbeit ausführen kann, die Sie benötigen.

z.

private void SetWorkerThreadToDoWork() 
{ 
    WorkerThread.Start(); 
} 

private void MyWorkerThreadWork() 
{ 
    //This will be on the WorkerThread (called from WorkerThread.Start()) 
    DoWorkFunc(); 
    WorkComplete(); 
} 

private void WorkComplete() 
{ 
    if(InvokeRequired == true) 
    { 
    //Do the invoke 
    } 
    else 
    { 
    //Check work done by worker thread 
    //e.g. ServersSqlDataSourceEnumerator.Instance.GetDataSources(); 
    } 
} 

Wenn es ein einfacher Prozess ist, Sie verwenden ich für einen BackgroundWorkerThread gehen würde, kommt dieser mit einer eigenen Ereignisse, die ausgelöst werden, wenn die Arbeit abgeschlossen ist. Aber wenn Sie einen Thread benötigen, würde ich entweder zu asynchronen Callbacks oder einem ähnlichen Weg wie oben gezeigt nachsehen.

1

Sie können meine Antwort auf dieses SO thread

überprüfen Sie verwendet einen Rückruf-Mechanismus. Wenn die asynchrone Operation abgeschlossen ist, wird die Rückrufmethode ausgelöst, mit der Sie die Verarbeitung nach der SQL-Ausführung durchführen können.

Verwenden Sie einen ähnlichen Ansatz, um benachrichtigt zu werden, wenn der asynchrone Vorgang ausgeführt wird.

Hoffe das hilft :)

Verwandte Themen