我之前做过一些在遇到严重错误时会自动停止的 Windows 服务。
在 WorkerRole 中将这些迁移到 Windows Azure,我想做同样的事情:能够从内部停止 WorkerRole 的执行。
我只是遇到一个小问题...
当Run方法结束时,会触发 WorkerRole OnStop方法,然后重新启动它……根据我的阅读,这是 WorkerRole 的正常行为。
然后我的问题是:如何告诉它“工作完成,请不要重新启动”
我之前做过一些在遇到严重错误时会自动停止的 Windows 服务。
在 WorkerRole 中将这些迁移到 Windows Azure,我想做同样的事情:能够从内部停止 WorkerRole 的执行。
我只是遇到一个小问题...
当Run方法结束时,会触发 WorkerRole OnStop方法,然后重新启动它……根据我的阅读,这是 WorkerRole 的正常行为。
然后我的问题是:如何告诉它“工作完成,请不要重新启动”
您无法停止特定角色实例。例如,您可以从 3 个实例缩减到 1 个,但您不能选择终止哪些实例。
如果您正在谈论需要启动、处理某些内容然后关闭(例如,每天一次)的单实例辅助角色,请考虑将此角色移至其自己的部署中。然后,使用管理 API,部署它,让它运行一个小时(或者不管你需要多久),然后挂起+删除它。
我不确定这实际上是否可行。你可以使用
Thread.Sleep(Timeout.Infinite);
但由于工作人员角色已部署到云上,您仍然需要付费,我认为真正停止这种情况的唯一方法是暂停 Azure 平台上的整个角色。
如果您的特定角色仅使用单个实例,您可以通过管理 API 将该角色的实例计数降低到 0。特定角色的切换不是受支持的功能,但您可以通过构建一个终止开关服务来使其工作,您可以在特定实例上调用该服务并同时减少实例数量。这需要一些管道代码,但是是可行的。
如果我正确阅读了您的问题....工人角色进程已停止但随后又重新开始?
我遇到了一些问题,如果工人角色运行很长时间,它基本上会重新开始。发生的情况是,Azure 假定在很长一段时间(通常为 30 秒)后,它假定角色已挂起,并将消息写回工作队列以确保该过程完成。
我在这里尝试一下,但是在您的情况下,停止工作人员角色是否可能不会导致从工作人员角色消息队列中删除消息?如果是这样,您可能想看看是否有办法在终止进程之前显式删除您正在处理的消息。
更多信息在这里
http://guerillaprogrammer.com/jakew/post/2010/03/23/Expiring-Azure-Queue-Message.aspx
我认为你可以使用 Thread.Suspend() http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx如果你想再次使用 Thread.Resume()
最近我遇到了同样的问题。我的问题是通过评论 ServiceConfiguration.Cloud.cscfg、ServiceConfiguration.Local.cscfg 和 ServiceDefinition.csdef 文件中的工作角色部分并打包项目来解决的。