Может кто-нибудь объяснить, что это значит для синхронного метода? Если я попытаюсь изменить метод, async
VS будет жаловаться на это.
Это работает:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Это не работает:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
В общем, я хотел бы знать, что именно это означает: Task.FromResult<object>(null);
c#
asynchronous
async-await
Дэвид Дьюри
источник
источник
return;
работаю ...!void
функции.Ответы:
async
методы отличаются от обычных методов. Все, что вы возвращаете изasync
методов, завернуто в файлTask
.Если вы не вернете значение (void), оно будет обернуто
Task
, если вы вернетесь,int
оно будет обернутоTask<int>
и так далее.Если ваш асинхронный метод должен возвращать,
int
вы должны отметить возвращаемый тип метода как,Task<int>
и вы вернете простой, аint
неTask<int>
. Компилятор будет преобразовыватьint
вTask<int>
вас.Таким же образом, когда вы
Task<object>
возвращаете тип возврата вашего метода, должен бытьTask<Task<object>>
Поскольку ваш метод возвращается
Task
, он не должен возвращать никакого значения. В противном случае он не будет компилироваться.Имейте в виду, что асинхронный метод без
await
оператора - нетasync
.источник
DoStuff()
. Например:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
- пример.При использовании async вам необходимо использовать ключевое слово await, а тип возвращаемого значения вашей функции должен быть общим. Вот пример с возвращаемым значением:
Вот пример без возвращаемого значения:
Прочтите это:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx и Задачи: http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = vs.110) .aspx
Асинхронный: http://msdn.microsoft.com/en-us/library/hh156513.aspx Ожидание: http://msdn.microsoft.com/en-us/library/hh156528.aspx
источник
null
напрямую, не дожидаясь фиктивной задачи.async
выдаст предупреждение), что метод будет выполняться асинхронно, с предложением использоватьawait
ключевое слово где-нибудь в методе. Я предлагаю просто использоватьreturn Task.FromResult((object)null);
и удалитьasync
ключевое слово, чтобы уменьшить предупреждающий шум компилятора.return
в Задаче, но задача продолжает выполняться, потому чтоreturn
не возвращаетTask
Добавление ключевого слова async - это просто синтаксический сахар, упрощающий создание конечного автомата. По сути, компилятор берет ваш код;
И превращает его в;
Если в вашем коде есть
await
ключевые слова, компилятор должен взять ваш метод и превратить его в класс, представляющий конечный автомат, необходимый для его выполнения. По каждомуawait
ключевому слову состояние переменных и стека будет сохранено в полях класса, класс добавит себя в качестве обработчика завершения к задаче, которую вы ожидаете, а затем вернется.Когда эта задача завершится, ваша задача будет выполнена снова. Поэтому в верхнюю часть метода добавляется некоторый дополнительный код, чтобы восстановить состояние переменных и перейти к следующему блоку вашего кода.
См. Что генерирует async & await? для кровавого примера.
Этот процесс имеет много общего с тем, как компилятор обрабатывает методы итератора с помощью операторов yield.
источник
Это задача, которая возвращает задачу типа String (анонимная функция C # или, другими словами, используется делегирование Func)
источник
Чтобы получить правильные ответы от асинхронных методов, вам нужно поставить await при вызове этих методов задачи. Это будет ждать преобразования его обратно в тип возвращаемого значения, а не в тип задачи.
источник