繁体   English   中英

如何等待异步委托

[英]How to await on async delegate

在其中一个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委托。

等待是实现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();

最近我发现NUnit能够await async void测试。 以下是它如何工作的好描述: nunit如何成功等待async void方法完成?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM