Как создать задачу без ее запуска?
Я хочу использовать этот Task < > конструктор. Я не могу заставить sntax правильно, может кто-то исправить мой код.
Также, правильно ли я думаю, что если задача сконструирована таким образом, она не запускается?
Мне нужен конструктор, который мне нужен:
Task<TResult>(Func<Object, TResult>, Object)
Ошибка моего кода:
Аргумент 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;
}
Ответы
Ответ 1
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");
Ответ 2
Я предпочитаю использовать Unwrap()
вместо Task.Result
Task<int> t = new Task<Task<int>>(async (ob) =>
await GetIntAsync((string)ob), "3").Unwrap();
Ответ 3
//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();