关于创建C#线程有一个简短的问题。快速C#线程类
- 它需要每10分钟
- 工人将做的工作,然后进入睡眠10分钟
- 它也可以被触发通过调用触发()立即运行,运行
- 它可以通过调用Stop()停止
我用ManualResetEvent创建了一个,它在调用Stop()时设置。这很好,但我是否需要创建另一个ManualResetEvent或等待句柄以便能够立即触发该工作人员?
关于创建C#线程有一个简短的问题。快速C#线程类
我用ManualResetEvent创建了一个,它在调用Stop()时设置。这很好,但我是否需要创建另一个ManualResetEvent或等待句柄以便能够立即触发该工作人员?
是的,你需要另一个等待句柄来强制线程执行。你将基本上必须为WaitOne
这个句柄10分钟,因此要么超过超时,要么等待句柄变成信号时继续。
不过,不要忘记将该句柄切换到无信号状态。
如果通过停止你的意思停止等待,不要再运行,那么我认为一个Threading.Timer将是一个好(精益)的选择。
您可以使用DoWork()方法和10分钟的间隔激活计时器。它将使用ThreadPool,这似乎是最佳选择。触发器()可以直接在Pool上对DoWork进行排队,Stop()可以禁用定时器。 DoWork()不应该使用Sleep()并适合ThreadPool。
+1:这可能是只要你去的好方法做适合于线程池线程的工作。请记住,线程池线程不适用于长时间运行的活动。您不会睡眠线程池线程,只需在手动触发器()的适当手动操作下每10分钟触发一次该操作即可。 – 2009-07-07 12:10:21
在这里使用计时器是有道理的。这是一个我没有测试过的快速代码片段。
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();
}
您正在使用单独创建的线程,但效率不如ThreadPool。 – 2009-07-07 13:59:52
也看看http://stackoverflow.com/questions/1091710/c-timer-or-thread-sleep – 2009-07-07 11:47:05