【问题标题】:Convert foreach to Parallel.ForEach将 foreach 转换为 Parallel.ForEach
【发布时间】:2014-07-15 10:00:05
【问题描述】:

我需要将 foreach 转换为 Parallel.foreach ,有人可以帮助我吗?

    foreach (DataRow row2 in DT.Rows)
    {
       try 
       {
           bool check = (urlcheck(dataGridView.Rows[i].Cells[2].Value.ToString()));
           if (check == true)
              ExecuteQuery("");
           else
              ExecuteQuery("");
       }
       catch{ }
       i++;
     }

【问题讨论】:

  • 为什么要转换为 Parallel.ForEach?
  • i = i++; 非常有趣的一段代码
  • 您甚至没有在 foreach 中使用 row2。你确定你甚至需要一个循环还是这最初是一个for 循环?
  • @IlyaIvanov 不仅if (check == true)ExecuteQuery(""); else ExecuteQuery("");也很有趣
  • @DGibbs 可能正在与ExecuteQuery一起使用

标签: c# foreach parallel-processing parallel.foreach


【解决方案1】:

我会使用 Parallel.ForEach 的重载,因此您的 i 参数由 foreach 方法提供:

Parallel.ForEach(DT.Rows.OfType<System.Data.DataRow>(), (DataRow row2, ParallelLoopState loopState, long i) =>
{
    try {
        bool check = (urlcheck(dataGridView.Rows[(int)i].Cells[2].Value.ToString()));
        if (check == true)
            ExecuteQuery("");
        else
            ExecuteQuery("");
    }
    catch{ }
});

对于OfType&lt;&gt; 方法,您需要将using System.Linq 添加到您的 using 语句中。

现在索引(i)由方法调用自动分配,因此您不必担心i的线程安全。

【讨论】:

  • Error1: 方法 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable, System.Action)' 的类型参数不能是从用法推断。尝试明确指定类型参数。
  • @MrKazemi 已更改,因此类型参数很清晰。这会给你一个错误吗?
  • @MrKazemi 我的错。我输入了DT 而不是DT.Rows 请再试一次。
  • Error1: 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable, System 的最佳重载方法匹配.Action)' 有一些无效参数 Error2:Argument 1: cannot convert from 'System.Data.DataRowCollection' to 'System.Collections.Generic.IEnumerable' Error3Argument 2:无法从“lambda 表达式”转换为“System.Action
  • @MrKazemi 另一个编辑。不要忘记添加 using 语句。
【解决方案2】:
Parallel.ForEach(DT.Rows, row2 => {
    try
    {
        bool check = (urlcheck(dataGridView.Rows[i].Cells[2].Value.ToString()));
        if (check == true)
            ExecuteQuery("");
        else
            ExecuteQuery("");
    }
    catch { }
    i = i++; 
});

请记住:i = i++; 如果使用不当,外螺纹可能会很危险。 (顺便说一句:奇怪的分配)

【讨论】:

  • 错误 1 ​​方法 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable, System.Action)' 的类型参数不能是从用法推断。尝试明确指定类型参数。
  • Parallel.ForEach(DT.Rows ... 给出一个错误,即无法从用法中推断出参数,因此所提供的答案将无法编译。您需要使用 DT.AsEnumerable( ) 并添加引用 System.Data.DataSetExtensions。
【解决方案3】:
Parallel.ForEach(DT.Rows, Row =>
{
  try
  {
    bool check = (urlcheck(dataGridView.Rows[i].Cells[2].Value.ToString()));
    if (check == true)
        ExecuteQuery("");
    else
        ExecuteQuery("");
  }
  catch() {}
  i = i++;
});

【讨论】:

  • C# 中的变量确实应该使用驼峰式大小写。
  • 从多个线程增加i 是行不通的。
  • 我的compnay项目我遵循camel case for variable name
  • 这取决于我们如何使用 i 的值。如果我们想检查有多少线程完成了执行,那么我们通过 i 值来获取它。
  • Error1:A class type expected
猜你喜欢
  • 1970-01-01
  • 2022-03-10
  • 2012-08-28
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2021-06-05
相关资源
最近更新 更多