3

我正在尝试验证我为我认为是一个相当典型的问题提出的解决方案。我有一项服务正在运行,每 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 修改进行任何类型的锁定,该修改被另一个线程调用,但我不确定我真的需要吗?我认为可能发生的最坏情况是它会运行一个额外的周期。

除此之外,这段代码还有什么明显的问题吗?有没有更好的方法来解决我不知道的这个问题?

4

4 回答 4

7

您可以尝试使用 System.Threading.Timer:

Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))
于 2010-05-14T16:21:30.730 回答
1

这不会每 10 分钟运行一次;DoSomething如果是一个快速的过程,它将非常接近每 10 分钟一次。下一次运行将在完成后 10 分钟发生DoSomething

您可以使用Quartz.Net 之类的作业调度程序。

于 2010-05-14T16:24:19.997 回答
0

一种更好的方法是使用 Windows Server AppFabric 之类的东西,它内置了重复任务、错误处理和管理的概念。您只需编写您需要的实际代码。不幸的是,它今天是最前沿的,但我会选择它来进行这种新的开发。

于 2010-05-14T16:20:09.563 回答
0

使用 Windows Workflow Foundation 怎么样?我认为它非常面向这类任务。

您可以通过您的程序启动 appruntime,然后让 WWF 应用程序处理这些事情。

于 2010-05-14T16:23:07.330 回答