代码之家  ›  专栏  ›  技术社区  ›  Shane Courtrille

如何处理重复执行?

  •  3
  • Shane Courtrille  · 技术社区  · 14 年前

    我试图验证我提出的解决方案,我认为这是一个相当典型的问题。我有一个服务在运行,每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修改进行任何类型的锁定,而stop()中的isrunning修改是由另一个线程调用的,但我不确定我真的需要这样做吗?我认为可能发生的最糟糕的情况是它多运行一个周期。

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

    4 回复  |  直到 13 年前
        1
  •  7
  •   user113476    14 年前

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

    Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))
    
        2
  •  1
  •   Austin Salonen gmlacrosse    13 年前

    这不会每10分钟运行一次;如果 DoSomething 是一个快速的过程。下一次跑步将在10分钟后进行 剂量测定法 完成。

    你可以使用像 Quartz.Net .

        3
  •  0
  •   Craig Stuntz    14 年前

    一个更好的方法是使用类似于WindowsServerAppFabric的东西,它具有重复性任务、错误处理和内置管理的概念。您只需编写所需的实际代码。不幸的是,它今天是出血的边缘,但这是我将选择为这种新的发展。

        4
  •  0
  •   Francisco Noriega    14 年前

    使用Windows工作流基金会怎么样?我认为它很适合这种任务。

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