主线程不等待parallel.foreach结束

时间:2019-02-20 08:49:53

标签: c# wpf multithreading

我为自己的代码中的问题而发疯。

我正在使用一个名为“ 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,该行为仍然存在。 堆栈跟踪类似。

0 个答案:

没有答案