2013-04-17 2 views
22

Я хочу использовать this Task<> constructor. Кажется, я не могу получить правильную ссылку, кто-то может исправить мой код.Как создать задачу без ее запуска?

Кроме того, правильно ли я думаю, что если задача сконструирована таким образом, она не запущена?

Конструктор Я думаю, что мне нужно:

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

Мой код erroring:

Аргумент 1: не удается преобразовать из 'группы методов' к '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

Я запутался, ваш метод уже 'async', почему вы хотите, чтобы заключить его в другой' Task'? – svick

+0

:-) для моделирования того, что вы на самом деле прокомментировали [это] (http://stackoverflow.com/questions/16054467/does-task-runsynchronously-work-recursive) thread –

+0

Ну, таким образом вы получите не запущенная «Задача», но это не та же «Задача», которая будет возвращена из метода «async». – svick

ответ

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

Или

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

Чтобы избежать использования лямбда, вам нужно написать статический метод, как это:

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

И потом:

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

Разве вы не используете другой конструктор, чем тот, о котором я спрашивал? –

+0

Я обновил ответ. –

+0

Первый конструктор использует замыкание для передачи параметров, второй конструктор использует состояние для передачи параметров. –

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

    //... 

    int result = yourTask.Result; 

UPDATE:

Да, к сожалению, он начинает задача. Используйте код, как упоминалось выше, вместо:

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

    //... 

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

Это создает ** и начинает **. Задание. Он хочет создать его ** без ** начала его. – Servy

0

Я предпочитаю использовать Unwrap() вместо Task.Result

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

Похоже, что 'Unwrap()' без 'Start()' в 'Task > 'изменяет это на задачу, которая никогда не может быть запущена: вызов' Start() 'в' Unwrapped() 'task вызывает' InvallidOperationException': «Запуск не может быть вызван задачей в стиле обещания». Использование 'await t' или' t.Result' ждет бесконечно. @Sel вы можете уточнить свой ответ о том, как позже запустить «Задача ' 't' и как получить его результат. –

Смежные вопросы