我使用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