【问题标题】:Timed windows service crashing due to multiple threads running由于多个线程运行,定时 Windows 服务崩溃
【发布时间】:2010-07-02 15:19:39
【问题描述】:

我正在开发一个简单的 Web 服务,它将数据从某个数据存储区导出到数据库中。

服务每 20 秒运行一次(测试间隔)。

间隔通过System.Timers.Timer类实现。

目前正在发生的事情是:

  1. 服务开始
  2. 定时器启动
  3. 20 秒过去了,服务开始导出
  4. 导出未在接下来的 20 秒内完成,另一个线程开始尝试执行相同的导出。
  5. 最终服务崩溃。

我打算将导出包装到一个单独的线程中,但不确定这是否能完全解决问题。

增加时间间隔不是一种选择,因为我不确定未来的出口量会有多大。

欢迎提出任何建议。

谢谢

编辑:

我想我想要的是: 1.启动定时器 2.启动线程 3.开始导出 4. 在前一个线程完成之前,不要让计时器启动另一个线程...

【问题讨论】:

  • 为什么不使用布尔静态字段来跟踪导出是否正在运行? (如果是,则不运行新线程)

标签: c# multithreading windows-services timer


【解决方案1】:

如何在第 3 步中先禁用计时器,然后在完成导出后重新启用计时器?

【讨论】:

  • +1 要添加,请在线程工作中注册回调,以便回调可以为您重新启用计时器。然而,这确实将计时器计时的时间间隔增加到 20 秒 + 执行时间。
  • 修复了问题。谢谢! :D
【解决方案2】:

我会做这样的事情。

public class MyServiceController
{
  private Thread m_Thread = new Thread(() => { Run(); });
  private ManualResetEvent m_StopSignal = new ManualResetEvent();

  public void Start()
  {
    m_Thread.Start();
  }

  public void Stop()
  {
    m_StopSignal.Set(); // Give it chance to end on its own.
    if (!m_Thread.Join(TimeSpan.FromSeconds(30))
    {
      // Tear everything down forcefully as an absolute last resort.
      m_Thread.Abort();
    }
  }

  private void Run()
  {
    while (!m_StopSignal(TimeSpan.FromSeconds(20))
    {
      // Put your code here.
    }
  }
}

这种方法分配一个专用线程进行处理,使所有内容保持同步。请注意,它使用WaitHandle 来限制间隔。同样重要的是要注意,我遗漏了很多代码,这些代码会使MyServiceController 更加健壮,例如处理想要多次调用Start 的调用者,确保工作线程在它不想停止时结束和平地等等。

【讨论】:

    【解决方案3】:

    有时您不想停止计时器,因为它可能会产生多个线程。在这种情况下,您将每个线程的关键部分包装在 Monitor.TryEnter 块中,锁定共享对象,这样如果在计时器再次触发时线程仍在运行,则新线程会无害地通过。

    private static object lockObject = new object();
    public void DoSomething()
    {
        if (System.Threading.Monitor.TryEnter(lockObject))
        {
            try
            {
                // critical stuff 
            }
            finally
            {
                System.Threading.Monitor.Exit(lockObject);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多