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();
}
4

2 に答える 2

1

同時スレッドの数がわかっている場合 (そして、それらがほぼ同時に開始される場合)、デリゲートBarrierで a を使用できます。PostPhaseAction

 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); 
于 2013-02-25T12:53:04.427 に答える
0

System.Threading.Timer を使用する

コールバック関数と、この関数を呼び出す間隔を指定できます。

于 2013-02-25T12:39:19.870 に答える