我为自己的代码中的问题而发疯。
我正在使用一个名为“ Interop.Automation.dll”的库,该库提供了一个事件“ dataChange”,并附加了一个处理程序。
在我的代码中的某个时刻,mainThread启动了Parallel.Foreach
Parallel.ForEach(aOPCItems.Cast<OPCItem>().ToList(), (item) =>
{
if (item.CanonicalDataType > 8000)
{
return;
}
IOPCItem itemTemp = new AutomationItem(item);
Monitor.Enter(listOPCItems);
listOPCItems.Add(itemTemp);
Monitor.Exit(listOPCItems);
Monitor.Enter(opcItemDict);
if (!opcItemDict.ContainsKey(item.ClientHandle))
{
opcItemDict.Add(item.ClientHandle, itemTemp);
}
Monitor.Exit(opcItemDict);
});
mainThread开始执行某些项目的Parallel.Foreach主体。
在此Parallel.Foreach期间,dataChage事件似乎正在触发,并且主线程去执行处理程序的代码。
Parallel.Foreach中没有代码可以触发该事件。
在处理程序的代码中以断点停止执行,我可以看到mainthread在那儿工作,而workingThreads在Paralle.Foreach主体中工作。
当mainThread在处理程序代码中结束工作,而workingThread在Parallel.Foreach主体中结束工作时,则mainThread在Parallel.Foreach下继续执行代码。
mainThread离开Parallel.Foreach去执行处理程序的代码然后返回就可以了吗?
这是mainThread执行处理程序代码期间的调用堆栈
这是AutomationItem构造函数中的代码
private string _itemName;
private OPCItem _item;
private object _value;
private string _quality;
Array ItemServerHandles = Array.CreateInstance(typeof(Int32), 2);
int cancelID;
int transactionID = 1;
public AutomationItem(OPCItem item)
{
_item = item;
if (item.Quality == 192)
{
_quality = "Good";
}
else
{
_quality =
((OPCQuality)item.Quality).ToString().Replace("OPCQuality", String.Empty);
}
_itemName = item.ItemID;
ItemServerHandles.SetValue(item.ServerHandle, 1);
}
编辑: 我已用普通的foreach替换了Parallel.Foreach,该行为仍然存在。 堆栈跟踪类似。