2014-09-19 62 views
0

我有一個線程正在循環,並執行一些工作和執行之間的睡眠。我需要一種方法,將強制循環執行一次迭代,並等待一個完整的迭代完成無限循環線程的一次迭代塊

我能夠強制循環運行與AutoResetEvent,但不能想到一個安全的方式等待,直到胎面做了一次迭代。

public class EndlessLoopThread 
{ 
    private AutoResetEvent _wakeupEvent = new AutoResetEvent(false); 
    private Thread _thread; 
    public int Count; 

    public EndlessLoopThread() 
    { 
     _thread = new Thread((s) => 
     { 
      while (true) 
      { 
       //... (Do a bunch of important stuff here) 
       Interlocked.Increment(ref Count); 

       _wakeupEvent.WaitOne(5000); 
      } 
     }); 
     _thread.Start(); 
    } 

    public void DoStuffOnThreadAndBlockUntilDone() 
    { 
     _wakeupEvent.Set(); 

     //how do i block until the thread has done its stuff and gone back to sleep 
    } 
} 

任何想法,我可以阻止,直到線程完成其工作?

回答

1

您可以將線程的信號機制添加到應該等待的方法。然後使用以下內容:

_workStarted.Reset(); 
_workCompleted.Reset(); 
_wakeupEvent.Set(); 
_workStarted.WaitOne(); 
_workCompleted.WaitOne(); 

這應該保證重要的東西至少執行過一次。

但是,解決方案有點複雜,這表明問題可能會重新設計。我認爲你可以更好地使用模式等消費者/製作人。添加要完成的東西並等待特定的東西完成或沒有任何可處理的東西。儘管需要更多關於用例的知識。

+0

謝謝,看起來像這樣做。我想重新設計它,不幸的是,這是一個複雜,不熟悉和脆弱的現有代碼庫。想要一個runonce方法來獲得一些單元測試一致的工作。 – Alex 2014-09-22 07:59:15