快速C#线程类

时间:2009-07-07 11:42:45

标签: c# multithreading

有关于创建C#线程的快速问题。

  • 需要每10分钟运行一次
  • 工人将继续工作,然后再睡10分钟
  • 也可以通过调用Trigger()
  • 来触发它立即运行
  • 可以通过调用Stop()
  • 来停止它

我用ManualResetEvent创建了一个,它在调用Stop()时设置。这很好但是我需要创建另一个ManualResetEvent或wait句柄才能立即触发工作者吗?

3 个答案:

答案 0 :(得分:7)

如果停止你的意思是停止等待而不再运行那么我认为Threading.Timer将是一个很好的(精益)选择。

您可以使用DoWork()方法和10分钟间隔激活计时器。它将使用ThreadPool,这似乎是最好的选择。 Trigger()可以直接在Pool上排队DoWork,Stop()可以取消激活Timer。 DoWork()不应该使用Sleep()并且适合ThreadPool。

答案 1 :(得分:1)

在这里使用计时器是有道理的。这是一个我没有测试的快速代码片段。

    private System.Timers.Timer _timer = null;

    public void Constructor()
    {
        _timer = new System.Timers.Timer(600000);
        _timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
    }

    public void ForceDoWork()
    {
        //unsubscribe to timer event, so work dowsnt get fired twice
        _timer.Elapsed -= new ElapsedEventHandler(t_Elapsed);

        StartWorking();

        _timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
    }

    public void StartWorking()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(WorkToBeDone));
    }

    private void WorkToBeDone(object state)
    {
        //work here
    }

    public void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        StartWorking();
    }

答案 2 :(得分:0)

是的,你需要另一个等待句柄来强制线程执行。对于此句柄,您基本上必须WaitOne持续10分钟,因此要么超时,要么在等待句柄发出信号时继续。

不要忘记将该句柄切换到非信号状态。