關於創建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