【问题标题】:Parallel.For don't wait for complete all loopsParallel.For 不要等待完成所有循环
【发布时间】:2019-12-03 05:05:51
【问题描述】:

我有一些代码运行了几次就不行了。我的意思是在 10% 的运行中它返回错误的答案。 问题是,这段代码有时不会等待 Parallel.For 完成所有迭代并进入下一步。

代码在这里:

List<DataTable> TarazKolsDelimeted = new List<DataTable>(AllDelimetedDatatablesCodeKol.Count);
var res = Parallel.For(0, AllDelimetedDatatablesCodeKol.Count, (taskNumber) =>
{
    var currentTableAsnad = AllDelimetedDatatablesCodeKol[taskNumber];
    var currentTableTarazKol = _dsFullTables.Tables["tarazkol"].Clone();
    calculateTarazDaftar.CalculateTarazKol(currentTableAsnad, ref currentTableTarazKol);
    TarazKolsDelimeted.Add(currentTableTarazKol);
});

if (!res.IsCompleted)
{
    addMemoEdit("Anormal Exit !");
}

foreach (var dataTable in TarazKolsDelimeted) 
{
    foreach (DataRow dataRow in dataTable.Rows)
    {
        _dsFullTables.Tables["tarazkol"].ImportRow(dataRow);
    }
}

我设置了 if (!res.IsCompleted) 进行检查,但这个 'if' 不能解决我的问题。

【问题讨论】:

  • 循环中的某个命令抛出异常?
  • @Brannon 我没有得到任何异常,只是有时答案不完整
  • 这段代码看起来并不安全。 List&lt;Datatable&gt; 不是线程安全的。我怀疑这就是您的问题所在,而不是过早退出(我不相信它确实如此)。
  • 向 List 添加内容不是线程安全的。不要从 Parallel.For 修改 List。改为查看 ConcurrentBag

标签: c# parallel.for


【解决方案1】:

根据好的cmets,我找到了答案。

问题出在

TarazKolsDelimeted.Add(currentTableTarazKol);

只是我必须使用 lock 或 ConcurrentBag 来解决这个问题。

感谢所有朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2012-09-30
    • 2016-09-09
    • 1970-01-01
    • 2022-01-04
    • 2017-05-03
    相关资源
    最近更新 更多