给出以下代码:
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
时,作业就会完成。
答案 0 :(得分:3)
除非您正在编写事件处理程序,否则不应该async void
。 Action
async
修饰符的async void
是Func<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来处理函数。