有关于创建C#线程的快速问题。
我用ManualResetEvent创建了一个,它在调用Stop()时设置。这很好但是我需要创建另一个ManualResetEvent或wait句柄才能立即触发工作者吗?
答案 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分钟,因此要么超时,要么在等待句柄发出信号时继续。
不要忘记将该句柄切换到非信号状态。