我想你正在寻找TaskCompletionSource
. 这为您提供了最大的灵活性。您可以在任务上设置例外,将其标记为未完成等。或者Task.FromResult
。
在许多情况下,启用 Task 来表示外部异步操作很有用。为此目的提供了 TaskCompletionSource。它可以创建可以分发给消费者的任务。消费者可以像在任何其他场景中处理任务成员变量一样使用任务成员。
考虑以下两个选项,我包括第一个,但你不能返回 a Task.CompletedTask<T>
,但如果你只想返回一个已完成的任务,例如因为你可能out
已经设置了一些参数,那么这可能就是你的答案。
static async Task SomeMethod()
{
await Task.CompletedTask;
}
或者 - 因为我们不能在没有 async 的情况下使用 await
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);
}
或上述的异步变体
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);
}