如何等待异步委托
本文关键字:异步 等待 何等待 | 更新日期: 2023-09-27 18:00:17
在一个MVA视频中,我看到了下一个构建:
static void Main(string[] args)
{
Action testAction = async () =>
{
Console.WriteLine("In");
await Task.Delay(100);
Console.WriteLine("After first delay");
await Task.Delay(100);
Console.WriteLine("After second delay");
};
testAction.Invoke();
}
执行结果为:
In
Press any key to continue . . .
它编译得很好,但现在我看不出有什么方法可以等待它。我可能会在调用后放入Thread.Sleep
或Console.ReadKey
,但这不是我想要的。
那么,应该如何修改此委托以使其变得不可用呢?(或者至少我如何跟踪完成的执行?)
这种代表有什么实际用途吗?
为了等待一些东西,它必须不可访问。由于void
不是这样,您不能等待任何Action
委派。
awaitable是实现GetAwaiter
方法的任何类型,该方法返回实现INotifyCompletion
或ICriticalNotifyCompletion
的类型,例如Task
和Task<T>
。
如果您想等待委托,请使用Func<Task>
,它等效于具有以下签名的命名方法:
public Task Func()
因此,为了等待,请将您的方法更改为:
static void Main(string[] args)
{
Func<Task> testFunc = async () =>
{
Console.WriteLine("In");
await Task.Delay(100);
Console.WriteLine("First delay");
await Task.Delay(100);
Console.WriteLine("Second delay");
};
}
现在你可以等待了:
await testFunc();
"Async void仅用于顶级事件处理程序";,
https://learn.microsoft.com/en-us/shows/three-essential-tips-for-async/tip-1-async-void-top-level-event-handlers-only
最近我发现NUnit能够进行await
async void
测试。以下是它的工作原理:nunit是如何成功地等待异步void方法完成的?
您不会在常规任务中使用它,但很高兴知道它可能是