我正在尝试验证我提出的解决方案,因为我认为这是一个相当典型的问题。我有一个服务运行,每10分钟应该做一些事情。我最终得到了以下内容:
private AutoResetEvent autoResetEvent = new AutoResetEvent(true);
private bool isRunning = true;
public void Execute()
{
while(isRunning)
{
DoSomething();
if(isRunning)
{
autoResetEvent.WaitOne(new Timespan(0, 10, 0));
}
}
}
public void Stop()
{
isRunning = false;
autoResetEvent.Set();
}
我可以看到的直接潜在问题是我没有对Stop()中的isRunning修改进行任何类型的锁定,而另一个线程会调用它,但我不确定我真的需要吗?我认为可能发生的最糟糕的事情是它会运行一个额外的周期。
除此之外,这段代码有任何明显的问题吗?有没有更好的方法来解决这个我不知道的问题?
答案 0 :(得分:7)
您可以尝试使用System.Threading.Timer:
Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))
答案 1 :(得分:1)
这不会每10分钟一次;如果DoSomething
是一个快速的过程,它将非常接近每10分钟。下一次运行将在DoSomething
完成后10分钟发生。
您可以使用Quartz.Net等作业计划程序。
答案 2 :(得分:0)
更好的方法是使用Windows Server AppFabric之类的东西,它具有重复性任务,错误处理和内置管理的概念。您只需编写所需的实际代码。不幸的是,今天它正在流行,但这是我为这种新发展所选择的。
答案 3 :(得分:0)
使用Windows Workflow Foundation怎么样?我认为它非常适合这类任务。
你可以通过你的程序启动appruntime,然后让WWF应用程序处理事情。