在Azure云服务运行覆盖中使用await
是否存在任何问题?
我在一个函数调用中添加了一个await
调用并开始得到非常奇怪的行为,后续的方法调用显然立即返回(尽管它们应该花费几秒钟)并且VS.NET 2012锁定并要求完全重启。
目前唯一的想法是,在await
调用之后,Run
方法正在另一个线程上执行,并且Azure中可能要求此Run
覆盖始终在固定的线程上运行?
但是,如果是这种情况,是否有办法确保await
调用始终同步回此线程?
或者其他什么东西可以发挥作用?
答案 0 :(得分:3)
如documentation for Run
所述,您的方法不应该返回;如果是这样,Azure运行时会将其解释为错误并重新启动您的角色。
await
导致其方法在等待操作时返回。如果不清楚,那么我有async
intro on my blog您可能会觉得有帮助。
因此,Run
方法不能是async
。
我通常在async
方法中安装Run
兼容的“主循环”,然后在其中运行无限循环。我的AsyncEx library有一个名为AsyncContext
的“主循环”类型,可以像这样使用:
public override void Run()
{
try
{
AsyncContext.Run(async () =>
{
// Can use await safely in here.
while (true)
;
});
}
catch (Exception ex)
{
// log
throw;
}
}
这种方法的缺点是它只能在角色实例中有效地使用单个线程。我只是设计我的扩展,只使用单核尺寸;它比使用多核大小和添加代码以支持多个async
线程更容易。