2013-04-17 13 views
22

Chcę użyć this Task<> constructor. Nie wydaje mi się, żebym dostał prawo do sntax, czy ktoś może poprawić mój kod.Jak skonstruować zadanie bez jego uruchamiania?

Co więcej, mam rację, myśląc, że jeśli zadanie jest skonstruowane w ten sposób, to nie jest ono rozpoczęte?

Konstruktor Chyba muszę:

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

Mój kod erroring:

Argument 1: nie można przekonwertować z 'grupy metodą' na '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

jestem zdezorientowany, metoda jest już 'async', dlaczego chcesz dołączyć go w inny' Zadanie "? – svick

+0

:-) Modelujemy coś, o czym skomentowałeś [this] (http://stackoverflow.com/questions/16054467/does-task-runsynchronously-work-recursively) thread –

+0

Cóż, w ten sposób otrzymasz unstarted 'Task', ale to nie jest to samo' Task', które zostanie zwrócone z metody 'async'. – svick

Odpowiedz

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

Albo

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

Aby uniknąć stosując lambda, trzeba napisać statycznej metody takie jak to:

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

, a następnie:

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

Czy nie używasz innego konstruktora niż ten, o który pytałem? –

+0

Zaktualizowałem odpowiedź. –

+0

Pierwszy konstruktor używa zamknięcia do przekazania parametrów, drugi konstruktor używa stanu do przekazania parametrów. –

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

    //... 

    int result = yourTask.Result; 

UPDATE:

Tak, niestety to się zaczyna zadanie. Użyć kodu jak wspomniano powyżej zamiast:

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

    //... 

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

To tworzy ** i zaczyna **. Zadanie. On chce go stworzyć ** bez ** uruchamiania. – Servy

0

wolę korzystania Unwrap() zamiast Task.Result

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

Wygląda na to, że 'Unwrap()' bez 'Start()' w 'Zadanie >' zamienia to na zadanie, które nigdy nie może być uruchomione: wywołanie 'Start()' w zadaniu 'Unwrapped()' wyrzuca ' InvallidOperationException': "Start może nie zostać wywołany w zadaniach stylu obietnic." Użycie 'await t' lub' t.Result' czeka w nieskończoność. @Sel możesz rozwinąć swoją odpowiedź, jak później uruchomić 'Task ' 't' i jak odzyskać jego wynik. –