Nach einem Beitrag von Stephen Toub (MSFT), gehen sie davon aus, dass wir auf Schließungen angewiesen sind, um Zustandsdaten zu übergeben (http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/1988294c-de41-476a-a104-aa550b7409f5)
Sich auf Schließungen zu verlassen, um dieses Problem zu lösen, scheint jedoch ein temporärer Hack zu sein, der auf eine bessere Lösung wartet.Es funktioniert, aber es ist keine gute längerfristige Lösung viele Male, dass einfach eine delegierte Methode als Aktion spezifizieren wäre die einfachste Ansatz sein, aber das bedeutet, dass wir globale vars verwenden haben oder wir aus dem Zustand Parameterübergabe ausgeschlossen.
I wie einer von Hugos Vorschlägen (aus dem MS-Forum-Posting). Hugo schlug vor, einen TaskState-Typ einzuführen, der wie ein cleverer Weg erscheint, das Problem der Mehrdeutigkeit von Generika zu umgehen.
Angewandt auf die Task.Factory.StartNew() Unterschrift und der Aufgabe() Konstruktor als solche:
public Task<T>(Action<T> function, TaskState<T> state);
public Task<T,TResult>(Func<T,TResult> function, TaskState<T> state);
Actionstate viel wie die Nullable-Klasse sein würde - nur ein einfacher Wrapper um einen Wert Mitglied. In der Praxis könnte mit Taskstate wie folgt aussehen:
var myTask = new Task(MyMethod, new TaskState(stateInfo));
...
public void MyMethod(StateInfo stateInfo) { ... }
Die Taskstate <> Lösung ist nicht perfekt, aber es scheint wie eine viel bessere Lösung als beim Schließen des Typs Gießen verlassen.
Ja, aber Task ist generisch im Ergebnistyp (TResult) einer Task, aber nicht generisch im Typ des "initial state" (dh die Eingabe für eine Task). –
Frank
Also ... Wenn ich Task.Factory.StartNew aufrufen greift es automatisch einen Thread aus dem Threadpool? –
@Padu: Ja, ich glaube schon - obwohl Sie Ihre eigene Task Factory haben können, die eine andere Reihe von Threads verwendet, glaube ich. –