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