我使用threadpool類和一個ManualResetEvents數組遇到了一些困難。下面是我正在做的一個簡單的例子。問題是,在DoWork方法中,我得到了對resetEvent [param as int]對象的空引用。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()之後,但我仍然得到一個空引用異常。
我已經做了多次編輯,以獲得代碼塊的工作。如果有人看到前面的迭代,請原諒它的混亂。 – Setheron 2009-08-20 15:12:04
我也嘗試過鎖定每個.Set()調用,因爲這會導致對該對象進行易失性讀/寫操作,但似乎不起作用。 非常令人沮喪。 – Setheron 2009-08-20 15:59:42
爲什麼在'Set()'之後你會發出內存障礙*?你需要在你調用Set()之前看到更新的數組元素*! – 2009-08-21 15:03:42