8

我有一个 Azure WorkerRole 无缘无故地停止(没有抛出异常)。它每次都停在同一个地方,但代码只是执行一个需要大约 20 秒才能运行的进程。任何人都可以假设为什么会这样吗?我不知道的 OnStart() 方法是否存在超时?

以下是我的工人角色中发生的事情的细分:

OnStart() -> 诊断配置

运行()->

  1. 设置定时器 (60) 以触发应用程序的内容
  2. 启动一个新线程以加载一些默认设置(大约需要 30 秒)

代码永远不会触及#1 的内容。

对于上面的#1,我已经尝试过使用和不使用计时器(没有区别)。对于上面的#2,我已经尝试过启动新线程和不启动新线程(没有区别)。

这是我的工作人员角色的调试输出:

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).
4

2 回答 2

10

至少在 1.6 或更高版本的模拟器中不需要 Run() 中的循环。但是我今天遇到了同样的问题。我花了几个小时找出原因可能是什么,发现我的项目使用了对 Microsoft.Windows.Azure 程序集 1.7 版的引用,而我使用的模拟器来自 10 月版(1.8)。Web 项目工作得很好,但流程工作者角色正在启动并立即停止,就像您描述的那样。OnStart、Run 和 OnStop 只是没有被调用。当我将我的工人角色引用到 1.8 程序集时,它又开始工作了。又浪费了几个小时,谢谢微软...

于 2012-11-08T18:26:08.253 回答
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)而不是循环。

于 2010-12-01T22:47:20.717 回答