Warum ist die TaskFactory.StartNew-Methode nicht generisch?

8

Die idente Methode zum Starten einer neuen Nur-Nebeneffekt-Aufgabe (dh eine Aufgabe, die kein Ergebnis liefert) mit der TPL in .NET 4.0 verwendet die folgende API:

%Vor%

Aber warum sieht die Signatur dieser API nicht so aus?

%Vor%

oder wie das

%Vor%

Technische Gründe oder ein anderer Grund?

    
Frank 03.12.2009, 14:10
quelle

2 Antworten

7

Okay, jetzt, da ich die Frage richtig verstanden habe:)

Ich glaube, es liegt daran, dass dies ein direkter Ersatz für ThreadPool.QueueUserWorkItem . Ich stimme zu, dass es etwas merkwürdig erscheint ... aber wenn Sie sowieso Lambda-Ausdrücke verwenden, ist es wahrscheinlich einfacher, die Version zu verwenden, die einen Zustandsparameter (d. H Action anstelle von Action<object> ) und erfassen Sie zuvor den Wert, an dem Sie interessiert sind. Es hilft nicht, wenn Sie den Wert und die Funktion separat angeben: (

    
Jon Skeet 03.12.2009, 14:13
quelle
3

Laut einem Beitrag von Stephen Toub (MSFT) gehen sie davon aus, dass wir uns auf Schließungen verlassen werden, um Zustandsdaten zu übermitteln. Es gab auch eine Entschuldigung für die Mehrdeutigkeit der Unterschrift. ( Ссылка )

Wenn man sich jedoch auf die Schließung eines solchen Problems verlässt, scheint es sich um einen temporären Hack zu handeln, der auf eine bessere Lösung wartet. Es funktioniert, aber es ist keine gute längerfristige Lösung. Es gibt viele Male, die einfach eine Delegate-Methode angeben, da die Aktion der einfachste Ansatz wäre, aber das bedeutet, wir müssen globale Variablen verwenden oder wir sind von der Statusparameterübergabe ausgeschlossen.

Ich mag einen Vorschlag von Hugo (aus dem MS-Forum-Posting). Hugo schlug vor, einen TaskState-Typ einzuführen, der wie ein cleverer Weg erscheint, um das Generics-Ambiguitätsproblem zu umgehen.

Dies wird auf die Task.Factory.StartNew () -Signatur und den Task () -Konstruktor als solches angewendet:

%Vor%

ActionState würde der Nullable-Klasse sehr ähnlich sein - nur ein einfacher Wrapper um ein Value-Member. In der Praxis könnte die Verwendung von TaskState wie folgt aussehen:

%Vor%

Der TaskState & lt; & gt; Lösung ist nicht perfekt, aber es scheint eine viel bessere Lösung zu sein, als sich auf das Schließen des Typgießens zu verlassen.

    
Jonathan B. 11.03.2011 21:44
quelle