Pro*_*rus 2 .net c# asynchronous task
我在这里有一种非常奇怪的感觉,我错过了一些东西,但现在我已经在这个问题上苦苦挣扎了几个小时,但无法得到它。我有一种任务调度类,它主要接收它启动的正常同步操作,而不是通过 Task.Run() 异步操作。但是,当它收到传递的异步操作时,它会返回而不等待等待任务。我将其简化为以下示例:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
    Logger("Click event received");
    await OperationProcessor(async () =>
    {
        Logger(">>> Starting ACTION, waiting 5 seconds");
        await Task.Delay(5000);
        Logger(">>> ACTION finished");
    });
    Logger("Click event finished");
}
private static async Task OperationProcessor(Action operation)
{
    Logger("Processing started, waiting a second");
    await Task.Delay(1000);
    Logger("Launching action");
    await Task.Run(operation);
    Logger("Returned from action, waiting another second");
    await Task.Delay(1000);
    Logger("Processing finished");
}
private static void Logger(string message)
{
    Console.WriteLine($"{DateTime.Now:dd.MM.yy HH:mm:ss} [{Thread.CurrentThread.ManagedThreadId}] {message}");
}
这会产生以下输出:
1: 16.07.19 10:58:06 [1] Click event received
2: 16.07.19 10:58:06 [1] Processing started, waiting a second
3: 16.07.19 10:58:07 [1] Launching action
4: 16.07.19 10:58:07 [7] >>> Starting ACTION, waiting 5 seconds
5: 16.07.19 10:58:07 [1] Returned from action, waiting another second
6: 16.07.19 10:58:08 [1] Processing finished
7: 16.07.19 10:58:08 [1] Click event finished
8: 16.07.19 10:58:12 [7] >>> ACTION finished
如何让 5 等待 4 开始的操作?
为什么不等待我传递给 Task.Run() 的异步操作?
await因为这是不可能的void。
人们经常谈论“等待方法”或“等待委托”,但这可能会产生误导。实际发生的情况是,首先调用该方法,然后等待它返回的任何内容。并且不可能等待 an 的结果,Action因为该委托返回void。
这是最好避免async void的主要原因。在本例中, 是async void很狡猾的,因为它是一个 lambda 表达式。
void Method()is的异步等效项async Task MethodAsync(),因此is的异步委托等效项ActionFunc<Task>。这就是添加Func<Task>重载有效的原因。您可以同时保留 theAction和Func<Task>重载,编译器会智能地选择lambdaFunc<Task>的重载async。
我有一种任务调度类
如果您的Func<Task>解决方案足够好,请保持原样。但如果您想更深入一点,可以检测(并等待)async void方法。async void方法与当前交互SynchronizationContext。由于您有自己的“调度类”,因此您可能需要考虑提供SynchronizationContext由该类调度的 for 代码。如果您有兴趣,请随意借用我的AsyncContext类,它本质上只是一个带有SynchronizationContext.
| 归档时间: | 
 | 
| 查看次数: | 1551 次 | 
| 最近记录: |