2009-07-07 66 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