2013-04-17 10 views
22

Ich möchte this Task<> constructor verwenden. Ich kann nicht scheinen, den Sntax richtig zu bekommen, kann jemand meinen Code korrigieren.Wie erstellt man eine Aufgabe, ohne sie zu starten?

Habe ich auch richtig gedacht, wenn eine Aufgabe auf diese Weise erstellt wird, wird sie nicht gestartet?

Der Konstruktor Ich glaube, ich brauche:

Task<TResult>(Func<Object, TResult>, Object) 

Mein Code erroring:

Argument 1: Aus 'Methodengruppe' nicht konvertieren 'System.Func<object,int>'

static void Main(string[] args) 
{ 
    var t = new Task<int>(GetIntAsync, "3"); //error is on this line 
    ... 
} 

static async Task<int> GetIntAsync(string callerThreadId) 
{ 
    ... 
    return someInt; 
} 
+0

mit Ich bin verwirrt, Ihre Methode ist schon 'async', warum tun Sie es in einen anderen umschließen wollen' Aufgabe? – svick

+0

:-), um etwas zu modellieren, das Sie tatsächlich kommentiert haben [http://stackoverflow.com/questions/16054467/does-task-runsynchronous-work-recursively) thread –

+0

Nun, auf diese Weise werden Sie eine bekommen unstarted "Task", aber es ist nicht die gleiche "Task", die von der Async-Methode zurückgegeben würde. – svick

Antwort

19
var t = new Task<int>(() => GetIntAsync("3").Result); 

oder

var t = new Task<int>((ob) => GetIntAsync((string) ob).Result, "3"); 

mit Lambda zu vermeiden, müssen Sie eine statische Methode wie folgt schreiben:

private static int GetInt(object state) 
{ 
    return GetIntAsync(((string) state)).Result; 
} 

Und dann:

var t = new Task<int>(GetInt, "3"); 
+0

Verwenden Sie nicht einen anderen Konstruktor als den, nach dem ich gefragt habe? –

+0

Ich habe die Antwort aktualisiert. –

+0

Der erste Konstruktor verwendet einen Abschluss, um Parameter zu übergeben, der zweite Konstruktor verwendet einen Status, um Parameter zu übergeben. –

-1
//creating task 
    var yourTask = Task<int>.Factory.StartNew(() => GetIntAsync("3").Result); 

    //... 

    int result = yourTask.Result; 

UPDATE:

Ja, leider fängt es an Aufgabe. Benutzen Sie den Code wie oben erwähnt stattdessen:

//creating task 
    var yourTask = new Task<int>(() => GetIntAsync("3").Result); 

    //... 

    // call task when you want 
    int result = yourTask.Start(); 
+2

Dies erstellt ** und starten **. Die Aufgabe. Er möchte es schaffen ** ohne es zu starten. – Servy

0

ziehe ich Unwrap() statt Task.Result

Task<int> t = new Task<Task<int>>(async (ob) => 
    await GetIntAsync((string)ob), "3").Unwrap(); 
+0

Es scheint, dass 'Unwrap()' ohne 'Start()' auf der 'Task >' dies in eine Task ändert, die nie gestartet werden kann: Aufruf von 'Start()' auf der 'Unwrapped()' Aufgabe löst ein ' InvallidOperationException': "Start wird möglicherweise nicht für eine Task im Stil einer Versprechensart aufgerufen." Die Verwendung von 'wait t' oder' t.Result' wartet unendlich. @Sel können Sie Ihre Antwort erarbeiten, wie Sie später die 'Task ' 't' starten und wie Sie das Ergebnis abrufen können. –

Verwandte Themen