将foreach转换为Parallel.ForEach

时间:2014-07-15 10:00:06

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

我需要将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++;
     }

3 个答案:

答案 0 :(得分:3)

我会使用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<>方法,您需要将using System.Linq添加到使用语句中。

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

答案 1 :(得分:-1)

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++;外部线程可能是dangroous。 (顺便说一句:奇怪的分配)

答案 2 :(得分:-2)

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++;
});