2009-07-07 68 views
2

关于创建C#线程有一个简短的问题。快速C#线程类

  • 它需要每10分钟
  • 工人将做的工作,然后进入睡眠10分钟
  • 它也可以被触发通过调用触发()立即运行,运行
  • 它可以通过调用Stop()停止

我用ManualResetEvent创建了一个,它在调用Stop()时设置。这很好,但我是否需要创建另一个ManualResetEvent或等待句柄以便能够立即触发该工作人员?

+0

也看看http://stackoverflow.com/questions/1091710/c-timer-or-thread-sleep – 2009-07-07 11:47:05

回答

0

是的,你需要另一个等待句柄来强制线程执行。你将基本上必须为WaitOne这个句柄10分钟,因此要么超过超时,要么等待句柄变成信号时继续。

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

7

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

您可以使用DoWork()方法和10分钟的间隔激活计时器。它将使用ThreadPool,这似乎是最佳选择。触发器()可以直接在Pool上对DoWork进行排队,Stop()可以禁用定时器。 DoWork()不应该使用Sleep()并适合ThreadPool。

+1

+1:这可能是只要你去的好方法做适合于线程池线程的工作。请记住,线程池线程不适用于长时间运行的活动。您不会睡眠线程池线程,只需在手动触发器()的适当手动操作下每10分钟触发一次该操作即可。 – 2009-07-07 12:10:21

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(); 
    } 
+0

您正在使用单独创建的线程,但效率不如ThreadPool。 – 2009-07-07 13:59:52