Зачем использовать async и ждать с Task <>?
Если у меня есть обычный метод, который я хочу сделать асинхронным:
public int Foo(){}
Я бы сделал:
public Task<int> FooAsync(){
return Task.Run(() => Foo());
}
Зачем мне делать:
public async Task<int> FooAsync(){
return await Task.Run(() => Foo());
}
Как я планирую использовать это:
FooAsync().ContinueWith((res) => {});
Я хочу, чтобы этот метод просто запускался без остановки, но я хочу, чтобы что-то вроде обратного вызова было уволено, следовательно < <24 > . Но со второй версией есть смысл использовать его?
Ответы
Ответ 1
В моем понимании вам нужно только async
и await
, когда вы пишете метод, который выполняет некоторые вызовы асинхронной связи внутри, но вы хотите, чтобы он выглядел так, как будто нет. Другими словами, вы хотите писать и читать код, как если бы это был обычный нормальный последовательный код, обрабатывать исключения, как если бы это был обычный последовательный код, возвращать значения, как если бы это был нормальный последовательный код и так далее. Тогда ответственность компилятора заключается в том, чтобы переписать этот код со всеми необходимыми обратными вызовами, сохраняющими логику.
Ваш метод настолько прост, что я не думаю, что он нуждается в этом переписывании вообще, вы можете просто вернуть задачу, но тот, кто ее потребляет, может захотеть await
для своего возвращаемого значения.
Ответ 2
Зачем мне делать:
public async Task<int> FooAsync()
{
return await Task.Run(() => Foo());
}
Ты бы не стал. Ваша предыдущая версия возвращает задачу, которая уже ожидает. Эта новая версия ничего не добавляет.
Как я планирую использовать это:
FooAsync().ContinueWith((res) => {});
Я хочу, чтобы метод просто запускался без остановки, но я хочу, чтобы что-то вроде обратного вызова было запущено, следовательно, ContinueWith.
Вот где разница. Позвольте немного рассказать о своем примере:
void DoAsyncStuff()
{
FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) });
}
Используя async
, вы можете написать тот же код, как это:
void async DoAsyncStuff()
{
int res = await FooAsync();
DoSomethingWithInt(res);
}
Результат тот же. Ключевое слово await
превращает остальную часть вашего метода в продолжение, которое возобновляется после того, как FooAsync производит значение. Это точно так же, как и ваш другой код, но его легче читать. * Пожав плечами *