我正在使用Tasks,Async并在我的WorkerRole(RoleEntryPoint)中等待。
我有一些无法解释的回收物,现在我发现,如果有一些东西在等待呼叫中长时间运行,那么这个角色就会回收。要重现它,只需在Run方法中等待Task.Delay(60000)。
任何可以向我解释原因的人?
答案 0 :(得分:22)
Run
方法必须阻止。来自the docs:
如果覆盖Run方法,则代码应无限期阻止。如果Run方法返回,则通过引发Stopping事件并调用OnStop方法自动回收角色,以便在角色脱机之前执行关闭序列。
一个简单的解决方案就是这样做:
public override void Run()
{
RunAsync().Wait();
}
public async Task RunAsync()
{
while (true)
{
await Task.Delay(60000);
}
}
或者,您可以使用AsyncContext
from my AsyncEx library:
public override void Run()
{
AsyncContext.Run(async () =>
{
while (true)
{
await Task.Delay(60000);
}
});
}
无论您选择哪个选项,Run
不都应为async
。对于控制台应用(see my blog for why async Main
is not allowed),它有点像Main
。
答案 1 :(得分:0)
我建议Task.Delay
的较低值,如1000(ms)。我怀疑工作者角色无法快速响应健康检查。然后,该角色被视为无响应并重新启动。
确保Run
方法永远不会返回类似
while (true)
{
Thread.Sleep(1000);
}
或者在您的情况下使用Task.Delay
。