ich zur Zeit etwas mit nach Hause gebacken Aufgabe Funktionalität mit einer neuen Implementierung mit der neuen System.Threading.Tasks Funktionalität in .net gefunden ersetzen 4.Wie Benachrichtigung erhalten, die eine System.Threading.Tasks.Task abgeschlossen hat
Ich habe allerdings ein kleines Problem, und obwohl ich mir einige Lösungen vorstellen kann, hätte ich gerne einen Ratschlag, welcher der beste Weg ist, um es zu tun, und ob ich irgendwo einen Trick verpasse.
Was ich brauche, ist für einen willkürlichen Prozess in der Lage zu sein, eine Aufgabe zu starten, aber dann weitermachen und nicht auf den Abschluss der Aufgabe warten. Kein Problem, aber wenn ich dann etwas mit dem Ergebnis einer Aufgabe machen muss, bin ich mir nicht sicher, wie es am besten geht.
Alle Beispiele, die ich gesehen habe, verwenden entweder Wait() für die Aufgabe, bis sie den Ergebnisparameter für die Aufgabe vervollständigt oder darauf verweist. Beide blockieren den Thread, der die Aufgabe gestartet hat, was ich nicht möchte.
Einige Lösungen dachte ich haben von:
einen neuen Thread erstellen und die Aufgabe auf, dass starten, verwenden Sie dann Wait() oder .RESULT den neuen Thread zu blockieren und das Ergebnis zurück an den Anrufer synchronisieren irgendwie, möglicherweise mit Abfragen zu den Aufgaben IsCompleted Parameter.
Haben Sie eine 'Benachrichtigen abgeschlossen' Aufgabe, die ich nach Abschluss der Aufgabe, die ich ausführen möchte, die dann ein statisches Ereignis oder etwas löst.
Übergeben Sie einen Delegaten in die Eingabe der Aufgabe und rufen Sie diesen auf, um zu benachrichtigen, dass die Aufgabe beendet ist.
ich denken kann, oder Vor-und Nachteile für alle von ihnen, aber ich besonders mag nicht die Idee, explizit einen neuen Thread zu erstellen, die Aufgabe zu beginnen, wenn die eines der Ziele der Verwendung Aufgabenklasse besteht in erster Linie darin, von der direkten Verwendung von Threads zu abstrahieren.
Irgendwelche Gedanken über den besten Weg? Fehle ich etwas Einfaches? Wäre ein "Completed" Event zu viel verlangt? (Sicher gibt es einen guten Grund, warum es nicht ein!)
Aus Neugier, warum nicht BackgroundWorker verwenden? Es hat die Aufgabe abgeschlossen, sowie Stornierung Benachrichtigung. – Robaticus
'BackgroundWorker' wird jetzt nicht mehr benötigt, da' Task' bei uns ist. BGW benötigt einen 'SynchronizationContext', der optional mit' Task' (ermöglicht größere Parallelität) ist. –