gpt4 book ai didi

c# - 在 Parallel.For 循环中调试失控线程

转载 作者:行者123 更新时间:2023-11-30 16:15:37 30 4
gpt4 key购买 nike

我在 .Net 4.5 下运行了以下代码

Parallel.For(0, fileArray.Length, i =>
{
DataRow dataRow = table.NewRow();
var dr = GetDataRow(fileArray[i], dataRow, parameters);
if (dr["MyVariable"].ToString() != "0")
{
try
{
table.Rows.Add(dr);
}
catch (Exception exception)
{
ConfigLogger.Instance.LogError(exception);
}
}
}
);

看似随机,此循环将使机器上的处理器达到最大并停止,使循环不再有进展。这是处理 11k 文件,我无法使用较小的文件集重复它。有没有人对如何调试此问题并找出导致此问题的原因有任何想法?我无法在我的机器上复制它,我的机器和生产之间的差异如下

生产版 Win 7 64 位,.Net 4.5

开发 Win 8 64 位,.Net 4.5.1

有没有办法在 parallel.for 循环的每个实例上放置超时异常?

最佳答案

如评论中所述,您需要使用线程本地数据表,Parallel 内置了对此的支持。也没有理由使用 Parallel.ForForEach 更适合这种情况。

Parallel.ForEach(fileArray,
() =>
{
lock(table)
{
//Create a temp table per thread that has the same schema as the main table
return table.Clone();
}
},
(file, loopState, localTable) =>
{
DataRow dataRow = localTable.NewRow();
var dr = GetDataRow(file, dataRow, parameters);
if (dr["MyVariable"].ToString() != "0")
{
try
{
localTable.Rows.Add(dr);
}
catch (Exception exception)
{
ConfigLogger.Instance.LogError(exception);
}
}
return localTable;
},
(localTable) =>
{
lock (table)
{
//Merge in the thread local table to the master table
table.Merge(localTable);
}
});

关于c# - 在 Parallel.For 循环中调试失控线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322921/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com