我有一个正在停止的Azure WorkerRole(没有抛出异常)没有明显的原因。它每次都停在相同的位置,但代码只是执行一个大约需要20秒才能运行的进程。任何人都可以假设为什么会发生这种情况?我不知道OnStart()方法是否超时?
以下是我的员工角色的细分:
OnStart() - >已配置诊断
运行() - >
代码永远不会受到#1的影响。
对于上面的#1,我已经尝试了有没有计时器(没有区别)。对于上面的#2,我已尝试过,无需启动新线程(没有区别)。
这是我的worker角色的Debug输出:
WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStart()
Microsoft.WindowsAzure.ServiceRuntime Information: 202 : Role entrypoint . COMPLETED OnStart()
The thread 'Role Initialization Thread' (0x29fc) has exited with code 0 (0x0).
Microsoft.WindowsAzure.ServiceRuntime Information: 203 : Role entrypoint . CALLING Run()
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Jason A. Kiesel\Projects\FS_CITYSOURCED\WorkersAzure\bin\Stage\WorkersAzure.csx\roles\Workers\approot\FreedomSpeaks.Logging.dll', Symbols loaded.
Microsoft.WindowsAzure.ServiceRuntime Warning: 204 : Role entrypoint . COMPLETED Run() ==> ROLE RECYCLING INITIATED
Microsoft.WindowsAzure.ServiceRuntime Information: 503 : Role instance recycling is starting
The thread 'Role Start Thread' (0x1fa0) has exited with code 0 (0x0).
The thread '<No Name>' (0x1624) has exited with code 0 (0x0).
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Microsoft.WindowsAzure.ServiceRuntime Information: 205 : Role entrypoint . CALLING OnStop()
WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStop()
Microsoft.WindowsAzure.ServiceRuntime Information: 206 : Role entrypoint . COMPLETED OnStop()
The thread 'Role Stop Thread' (0x2dac) has exited with code 0 (0x0).
The program '[12228] WaWorkerHost.exe: Managed (v4.0.30319)' has exited with code -66053 (0xfffefdfb).
答案 0 :(得分:10)
至少在仿真器1.6或更高版本中,不需要在Run()中循环。但是我今天也遇到了同样的问题。我花了几个小时找出原因是什么,发现我的项目使用了对Microsoft.Windows.Azure程序集1.7版的引用,我使用的模拟器来自10月版(1.8)。 Web项目工作得很好,但是流程工作者角色正在开始并且像您描述的那样立即停止。 OnStart,Run和OnStop都没有被调用。当我将我的worker角色引用到1.8组件时,它又开始工作了。浪费了几个小时,谢谢微软......
答案 1 :(得分:7)
没有看到代码,听起来就像你的Run方法正在退出。如果run方法退出,则角色将停止。在Visual Studio中添加到云项目时创建的默认辅助角色的方式是在方法的末尾添加无限循环。所以你的代码看起来可能类似于:
public override void Run()
{
StartMyTimer();
LoadDefaultSettings();
while (true)
{
CheckToMakeSureSpawnedThreadsAreRunningOK();
System.Threading.Thread.Sleep(10000);
}
}
正如smarx在评论中所提到的,也可以使用System.Threading.Thread.Sleep(Timeout.Infinite)
代替循环。