Pur*_*ome 2 .net c# timer azure azure-worker-roles
有很多人说使用a Timer而不是Thread.Sleep(...)in Azure Worker Role.没有这方面的问题.
我正在努力理解的是如何编写代码.
目前,我有以下(pseduo代码)
_timer.Elapsed += (sender, args) => DoWork();
public override void Run()
{
while(true)
{
DoWork();
}
}
public void DoWork()
{
try
{
_timer.Stop();
// Now - do stuff ....
}
catch(....) { ... }
_timer.Start()
}
Run Code Online (Sandbox Code Playgroud)
会发生什么,是代码进入DoWork()方法一次,然后DoesStuff(tm)..罚款..启动计时器(比如......间隔30秒),然后退出该方法.
然后,它返回到main Run()循环中的main 方法.所以它立即回来并DoWork()再次进入方法..而不是等待计时器将其关闭.
所以我不确定如何Thread.Sleep(...)用Timers 替换任何.
有线索吗?
我不想退出Run()方法:)我很高兴永远保持循环.我坚持使用的是替换标准Thread.Sleep(...)调用(阻塞线程)并将其替换Timer为大多数人建议的.
请不要链接或建议我cancelSource.Token.WaitHandle.WaitOne();作为解决方案使用.这不是我想在这里实现的.请注意帖子标题!
我想如果你想要按照你在这里概述的方式解决这种情况,你将需要一个WaitHandle和一个Timer.
简短的回答如下.长篇回答变成了博客文章:如何在ThreadRleep上使用Timer和EventWaitHandle在WorkerRole中等待
我使用了EventWaitHandle和Timer,并提出了这个解决方案:
public class WorkerRole : RoleEntryPoint
{
Waiter waiter;
public override bool OnStart()
{
waiter = new Waiter(WorkerConfiguration.WaitInterval);
return base.OnStart();
}
public override void Run()
{
while (true)
{
DoWork();
waiter.Wait();
}
}
public void DoWork()
{
// [...]
}
}
Run Code Online (Sandbox Code Playgroud)
这是服务员班:
public class Waiter
{
private readonly Timer timer;
private readonly EventWaitHandle waitHandle;
public Waiter(TimeSpan? interval = null)
{
waitHandle = new AutoResetEvent(false);
timer = new Timer();
timer.Elapsed += (sender, args) => waitHandle.Set();
SetInterval(interval);
}
public TimeSpan Interval
{
set { timer.Interval = value.TotalMilliseconds; }
}
public void Wait(TimeSpan? newInterval = null)
{
SetInterval(newInterval);
timer.Start();
waitHandle.WaitOne();
timer.Close();
waitHandle.Reset();
}
private void SetInterval(TimeSpan? newInterval)
{
if (newInterval.HasValue)
{
Interval = newInterval.Value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |