Я думаю, что вы ищете TaskCompletionSource
. Это дает вам наибольшую гибкость. Вы можете установить исключения для задачи, отметить ее как незавершенную и т. Д. c. В качестве альтернативы Task.FromResult
.
Во многих сценариях ios полезно включить Задачу для представления внешней асинхронной операции. TaskCompletionSource предоставляется для этой цели. Это позволяет создавать задачи, которые могут быть переданы потребителям. Потребители могут использовать члены задачи так же, как и в любом другом сценарии обработки переменных членов задачи.
Рассмотрим следующие варианты для обоих, я включаю первый, но вы не можете вернуть Task.CompletedTask<T>
, но если вы просто хотите вернуть выполненное задание, например, потому что, возможно, у вас были установлены некоторые параметры out
, тогда это может быть ваш ответ.
static async Task SomeMethod()
{
await Task.CompletedTask;
}
или - потому что мы не можем использовать await без asyn c
static Task<bool> SomeOtherMethod()
{
var taskSource = new TaskCompletionSource<bool>();
taskSource.SetResult(true);
return taskSource.Task;
}
или (. Net 4.5 +)
static Task<bool> SomeEvenOtherMethod()
{
return Task.FromResult(true);
}
или асин c варианта выше
static async Task<bool> SomeEvenOtherMethod()
{
var taskSource = new TaskCompletionSource<bool>();
taskSource.SetResult(true);
return (await taskSource.Task);
}
В качестве альтернативы: (. Net 4.5 +)
static async Task<bool> SomeEvenOtherMethod()
{
return(await Task.FromResult(true));
}
И с IAsyncEnumerable
static async IAsyncEnumerable<bool> GetBoolsAsync()
{
var t = await SomeOtherMethod();
yield return t;
}
Или (. Net 4.5 +)
static async IAsyncEnumerable<bool> GetBoolsAsync()
{
yield return await Task.FromResult(true);
}