C# 为什么等待退出?

C# 为什么等待退出?,c#,.net,async-await,C#,.net,Async Await,给定以下代码: public async Task Send() // part of Sender class { // sync code } // // private async Task HandleMessage() { // await sender.Send(); // exits HandleMessage immediately sender.Send().Wait();

给定以下代码:

    public async Task Send() // part of Sender class
    {
          // sync code
    }

    // // 

    private async Task HandleMessage()
    {
        // await sender.Send(); // exits HandleMessage immediately
        sender.Send().Wait(); // works as expected, waiting to complete
        DoOtherStuff(); // doesn't get hit with await
        return;
    }

    RunRecurringTask(async () => await HandleMessage(), result);

    public void RunRecurringTask(Action action, RecurringTaskRunResult result)
    {
            action();
            result.DoStuff();
    }
我认为wait告诉线程在等待的事情完成时返回,但由于某种原因,它似乎没有发生:剩余的代码永远不会被命中,所有的东西都只是。。。停止。这可能是什么原因造成的

这是Azure WebJob中的一个控制台应用程序。当使用Wait时,我得到了预期的结果,但是使用Wait时,作业就完成了。

除非您正在编写事件处理程序,否则永远不应该执行async void。带有async修饰符的操作是async void方法。您需要将参数设置为Func,然后在RunRecurringTask中执行等待操作


如果您有其他未标记为async的方法,则需要在调用堆栈中更改所有方法,直到从SDK到达入口点。SDK了解如何处理异步任务返回类型的函数。

当异步方法find wait时,它会将方法执行委托给另一个线程,方法会立即返回。方法执行完成后,它将返回来执行该方法的其余部分。@NiyokoYuliawan在我的例子中,我希望webjob继续运行,直到所有工作完成后才报告已完成。我看到的行为是DoOtherStuff永远不会被记录到webjob,除非我使用wait。如果您使用的是webjobs,那么您的问题是重复的,请包含调用HandleMessage的代码,这可能就是您的问题所在。@ScottChamberlain更新
private async Task HandleMessage()
{
    await sender.Send();
    DoOtherStuff();
    return;
}

RunRecurringTask(async () => await HandleMessage(), result);
//You also could do 
//RunRecurringTask(() => HandleMessage(), result);

public async Task RunRecurringTask(Func<Task> action, RecurringTaskRunResult result)
{
        await action();
        result.DoStuff();
}