私は、スレッドプールクラスとManualResetEventsの配列を使用するのが少し難しかったです。以下は、私がやっていることの簡単な例です。問題は、DoWorkメソッドで、resetEvent [param as int]オブジェクトへのnull参照を取得していることです。C#スレッドプール同期の照会
私が間違っていることを理解できないようです。
(編集:コードブロックの作業を得た)
private static volatile ManualResetEvent[] resetEvents = new ManualResetEvent[NumThreads];
public void UpdateServerData()
{
for (int i = 0; i < NumThreads ; i++)
{
resetEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), (object) i);
}
WaitHandle.WaitAll(resetEvents);
}
private void DoWork(object param)
{
//do some random work
resetEvents[(int)param].Set();
}
編集:私はSystem.Threading.Thread.MemoryBarrierを()を挿入しようとしています。それぞれの.Set()の後でもまだnull参照例外が発生します。
私は複数の編集を行って、コードブロックが機能するようにしました。誰かが以前の反復を見たなら、それが混乱していると言い訳してください。 – Setheron
私はまた、すべての.Set()呼び出しをロックしようとしましたが、これはオブジェクトの揮発性の読み込み/書き込みを引き起こすはずですが、どちらも機能しないように見えるからです。 非常にイライラします。 – Setheron
なぜあなたは 'Set()'の後にメモリバリア*を発行しますか?あなたは 'Set()'を呼び出す前に更新された配列要素*を見る必要があります! –