【发布时间】:2013-02-05 12:34:44
【问题描述】:
有很多人说在Azure Worker Role 中使用Timer 而不是Thread.Sleep(...)。没有问题。
我很难理解的是如何编写代码。
目前,我有以下(伪代码)
_timer.Elapsed += (sender, args) => DoWork();
public override void Run()
{
while(true)
{
DoWork();
}
}
public void DoWork()
{
try
{
_timer.Stop();
// Now - do stuff ....
}
catch(....) { ... }
_timer.Start()
}
然后发生的情况是,代码进入DoWork() 方法一次,DoesStuff(tm).. 很好.. 启动计时器(比如 .. 间隔 30 秒),然后退出该方法。
然后,它返回到该循环中的主 Run() 方法。因此它立即返回并再次进入DoWork() 方法.. 而不是等待计时器将其关闭。
所以我不确定如何用计时器替换任何Thread.Sleep(...)。
有什么线索吗?
澄清
我不想退出Run() 方法:) 我很高兴能一直循环下去。我坚持的是,替换标准的Thread.Sleep(...) 调用(阻塞线程)并用大多数人建议的Timer 替换它。
更新
请不要链接或建议我使用cancelSource.Token.WaitHandle.WaitOne(); 作为解决方案。这不是我想要在这里实现的。请注意帖子标题!
【问题讨论】:
-
如何将 DoWork() 置于无限循环之外,并将旧的 Thread.Sleep(10000) 放入该循环中。这个想法是只初始化一次计时器,您可以在 Run() 方法中执行它。
-
您是否阅读了关于替换
Thread.Sleep(..)的开头行,因为它是 NotGood(tm)? -
如果我理解正确,这个想法是 WorkerRole 永远不会出现在 Run() 方法中,否则你的工作角色将重新启动 (stackoverflow.com/questions/9561746/…)。我想我不明白为什么这是一个坏主意?您是否正在寻找要安排“DoStuff()”每 30 秒调用一次的功能?
-
啊对不起。好的,我不想退出 Run() 方法(所以你是对的)。但我不想使用
Thread.Sleep(..)来“暂停”工作人员(一段时间)。相反,我想使用计时器。 -
关于这个问题的第一个搜索结果给出了另一个 SO 问题,答案足够优雅,您只需在“do stuff”部分启动计时器,标记为重复问题。 stackoverflow.com/questions/9561746
标签: c# .net azure timer azure-worker-roles