2013-02-25 69 views
2

我需要同步的方法調用,使線程可以500ms的睡眠之後,調用此方法的線程調用。我有10個線程可能同時運行,因此只需簡單介紹Thread.Sleep(500)就沒有幫助。我怎樣才能以最簡單的方式實現這一目標?你有什麼建議?方法從一個特定延遲

_pool = new Semaphore(0, 10); 
_pool.Release(10); 
... 
pool.WaitOne(); 

Thread thr = new Thread(WorkerThread); 
t.Start(param); 
... 
public static void WorkerThread(object parameterData) 
{ 
    ... 
    MethodToBeSynced(); 
    ... 
    _pool.Release(); 
} 
+0

我不明白您的要求,對不起。爲什麼不能將Sleep(500)放在方法代碼的頂部? – 2013-02-25 12:32:24

+0

假設兩個線程同時啓動。如果他們同時來到這個「睡眠(500)」行,他們都會等待500毫秒,並最終同時調用我的方法。不過,我想的是,如果一個線程執行這種方法,其他線程應該等待500毫秒,並開始執行。(這應該是有效的,當然線程的其餘部分,如果他們試圖調用該方法) – Alpay 2013-02-25 12:43:16

+0

所以方法只能每500毫秒執行一次?聽起來很奇怪,不是嗎? – Arno 2013-02-25 12:50:08

回答

1

如果知道併發線程數(並且假設它們大約在同一時間開始),那麼可以使用BarrierPostPhaseAction委託。

var barrier = new Barrier(10, (x) => Thread.Sleep(500)); 

屏障等待,直到10個線程是在一定的代碼點,並且一旦出現這種情況,每個線程會睡眠500毫秒,然後繼續。

如果線程的確切數目是未知的,你可以指定一個等待超時不阻止無限。

// Waits up until N threads are at the barrier or after the timeout has elapsed. 
_barrier.SignalAndWait(500); 
0

使用System.Threading.Timer

你可以給它一個回調函數以及間隔時調用這個函數。