C# 如何处理重复执行?

C# 如何处理重复执行?,c#,multithreading,recurring,C#,Multithreading,Recurring,我正在尝试验证我针对一个我认为相当典型的问题提出的解决方案。我有一个服务正在运行,每10分钟它应该做些什么。我的结论如下: private AutoResetEvent autoResetEvent = new AutoResetEvent(true); private bool isRunning = true; public void Execute() { while(isRunning) { DoSomething(); if(isRunn

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


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

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

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

Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))

如何使用Windows工作流基金会?我认为它非常倾向于这类任务


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

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


您可以使用像。

这样的作业调度程序,这很酷,但不幸的是,它们运行的是我目前所在的Windows XP SP 2。实际上,我使用TopShelf来管理服务端的事情,这很好,但不做重复的事情。与AutoResetEvent相比,这会给我带来什么好处?它将消除AutoResetEvent和随之而来的繁琐逻辑。此外,DoSomething将在其自己的线程池线程中运行。计时器将直接调用DoSomething(),而不是运行循环。在stop()方法中,您只需停止计时器。while中的
if
不是多余的吗?很好。在我的示例中,这实际上是一个错误,我现在已经纠正了。DoSomething调用实际上发生在if之外。如果需要做一些事情,我们需要在睡觉前检查我们是否还在运行。对于这样一个简单的问题,工作流基金会似乎是一个巨大的浪费。在整个v4意味着重写之后,我也对使用它持谨慎态度。很好。是的,这正是我们希望发生的事情,但谢谢你指出这一点。