为什么要等待退出?

时间:2016-11-04 03:36:04

标签: 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(); // 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();
    }

我认为await告诉线程在等待的事情完成时回来,但看起来由于某种原因没有发生:剩下的代码永远不会被击中而且一切都只是......停止可能是什么导致了这个?

这是Azure WebJob中的控制台应用程序,它的价值在于它。使用Wait时,我会得到预期的结果,但是使用await时,作业就会完成。

1 个答案:

答案 0 :(得分:3)

除非您正在编写事件处理程序,否则不应该async voidAction async修饰符的async voidFunc<Task>方法。您需要将参数设为await action(),然后在RunRecurringTask

中执行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(); }
async

如果您有其他方法未标记async Task,则需要在调用堆栈中更改所有方法,直到从SDK进入入口点。 SDK了解如何使用DateInterval返回类型since the 0.4.0-beta version来处理函数。