如何处理重复执行?

时间:2010-05-14 16:16:45

标签: c# multithreading recurring

我正在尝试验证我提出的解决方案,因为我认为这是一个相当典型的问题。我有一个服务运行,每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 个答案:

答案 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应用程序处理事情。