В отличие от Task.Wait()
или Task.Result
, await
'ing a Task
в C# 5 предотвращает поток, который выполняет ожидание от лежачего пара. Вместо этого метод, использующий ключевое слово await
, должен быть async
, так что вызов await
просто заставляет метод возвращать новую задачу, которая представляет выполнение метода async
.Как создать задачу, которая всегда дает?
Но когда await
«эд Task
завершается до метода async
получил процессорное время снова, await
признает Task
, как законченную и, таким образом, метод async
возвращает Task
объект только в более позднее время. В некоторых случаях это будет позже, чем приемлемо, потому что, вероятно, это распространенная ошибка, которую разработчик предполагает, что оператор await
всегда откладывает последующие утверждения в своем методе async
.
структура ошибочного async
методы может выглядеть следующим образом:
async Task doSthAsync()
{
var a = await getSthAsync();
// perform a long operation
}
Тогда иногда doSthAsync()
возвратит Task
только после долгого времени.
Я знаю, что это должно скорее быть написано так:
async Task doSthAsync()
{
var a = await getSthAsync();
await Task.Run(() =>
{
// perform a long operation
};
}
... или что:
async Task doSthAsync()
{
var a = await getSthAsync();
await Task.Yield();
// perform a long operation
}
Но я не считаю, последние две модели довольно и хотите, чтобы предотвратить ошибку происходить. Я разрабатываю структуру, которая обеспечивает getSthAsync
, и первая структура должна быть общей. Таким образом, getSthAsync
должен возвращать Awaitable, который всегда дает как YieldAwaitable
, возвращенный Task.Yield()
.
К сожалению, большинство возможностей, обеспечиваемых библиотеки Task Parallel Library, как Task.WhenAll(IEnumerable<Task> tasks)
работают только на Task
с таким результатом getSthAsync
должен быть Task
.
Как можно вернуть Task
, который всегда дает?
Использование не является проблематичным; проблема в том, что это необходимо сделать (на мой взгляд). – ominug
Или просто 'Task.Run (() => {})'. Это тоже должно работать. – usr
@usr true, только у него есть условие гонки, так как задача может завершиться до проверки «IsCompleted». – i3arnon