如何等待异步委托

本文关键字:异步 等待 何等待 | 更新日期: 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.SleepConsole.ReadKey,但这不是我想要的。

那么,应该如何修改此委托以使其变得不可用呢?(或者至少我如何跟踪完成的执行?)

这种代表有什么实际用途吗?

如何等待异步委托

为了等待一些东西,它必须不可访问。由于void不是这样,您不能等待任何Action委派。

awaitable是实现GetAwaiter方法的任何类型,该方法返回实现INotifyCompletionICriticalNotifyCompletion的类型,例如TaskTask<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能够进行awaitasync void测试。以下是它的工作原理:nunit是如何成功地等待异步void方法完成的?

您不会在常规任务中使用它,但很高兴知道它可能是