每当一个 Windows Azure 角色停止时,它的OnStop()
方法就会被调用。事实证明,在调用之前触发了RoleEnvironment.Stopping
事件OnStop()
。MSDN 说这个事件是角色清理关闭代码的正确位置。
两者有什么区别?为什么我要将角色干净的关闭代码放在Stopping
事件中而不是OnStop()
方法覆盖中?
每当一个 Windows Azure 角色停止时,它的OnStop()
方法就会被调用。事实证明,在调用之前触发了RoleEnvironment.Stopping
事件OnStop()
。MSDN 说这个事件是角色清理关闭代码的正确位置。
两者有什么区别?为什么我要将角色干净的关闭代码放在Stopping
事件中而不是OnStop()
方法覆盖中?
除了事件机制提供了一种附加处理程序的灵活方式,而该OnStop
方法必须直接在派生自的类上定义这一事实之外RoleEntryPoint
,一个相关的区别是:
The Stopping event is not raised when the virtual machine of the role
instance is rebooted.
因此,不会引发停止事件,例如,当虚拟机重新启动以进行客户操作系统升级时。
另一个区别是:
Code running in the OnStop method has 5 minutes to finish when it is called
for reasons other than a user-initiated shutdown.
虽然文档中没有提到 Stopping 事件有这样的限制。
资源:
事件允许其他类中的其他订阅者执行某些操作,而该方法允许子类作者(例如您自己)将其放置在实际类中并(例如)修改引发哪些事件。
Brent Stineman (Windows Azure MVP) 最近发表了一篇关于 RoleEntryPoint 和相关启动/运行/停止序列的博客,并在序列描述中描述了 Stopping 和 OnStop。