2015-09-28 62 views
0

我试图将我的foreach方法转换为多线程。DataGridView和多线程

我有一个datagridview和方法从cell[0](其中包含一个URL)获取值并将其发送到与httpwebrequest一起使用的另一种方法。

public void UrlCheck() 
{ 
    foreach (DataGridViewRow row in dataUrlList.Rows) 
    { 
     string url= row.Cells[0].Value.ToString(); 
     try 
     { 
      string get = getHtml(url); 
      //work with get string removed 
      if() 
      { 
       row.Cells[1].Value = "page info here"; 
      } 
      else 
      { 
       row.Cells[1].Value = "error info here"; 
      } 
     } 
     catch 
     { 
     }      
    } 
    MessageBox.Show("Done."); 
} 

上述代码工作没有任何问题,但顺序。

于是有了这个,我一直在努力,这个代码转换为是多线程:

按钮:

private void button9_Click(object sender, EventArgs e) 
{ 
    int threadcount = Convert.ToInt32(numThreadSearch.Value); 
    ThreadForSearch = new Thread[threadcount]; 
    checkingForSearch = dataUrlList.Rows.Count; 
    isRunningForSearch = true; 
    beenCheckedForSearch = 1; 

    for (int i = 0; i <= threadcount - 1; i++) 
    { 
     ThreadForSearch[i] = new Thread(new ParameterizedThreadStart(MultiThreadMet)); 
     ThreadForSearch[i].Start(i); 
    } 
} 

和多线程的方法是在这里:

public void MultiThreadMet (object IndexForSearch) 
{     
    int index = (int)IndexForSearch; 
    DataGridViewRow row = dataUrlList.Rows[index]; 

    while (isRunningForSearch) 
    { 
     try 
     { 
      if (beenCheckedForSearch >= checkingForSearch) 
      { 
       isRunningForSearch = false; 
      } 

      if (index >= dataUrlList.Rows.Count) 
      { 
       ThreadForSearch[index].Abort(); 
      }      

      //For just test i'm trying to add "test" in every cell[1] in datagridview 
      dataUrlList.Invoke(new Action(() => row.Cells[1].Value = "test")); 

      beenCheckedForSearch++; 
     } 
     catch 
     { 
     }       
    } 
    ThreadForSearch[1].Abort();  
} 

它得到线程数从一个numericUpDown控件运行,如果我从numericUpDown中选择值10,它将“test”文本放在datagridview的前10个单元格中,然后停止,如果我选择e 4(或2,5,7),然后将“测试”文本放入前4(2,5,7)个单元格中并停止。

线程完成后它不会继续到下一行。所以我试图激发5个线程(我总是从numericUpDown中选择它),当一个线程完成它的工作时,它必须进入下一行。我该如何解决这个问题?

而且这些变量已经声明:

Thread[] ThreadForSearch; 
int beenCheckedForSearch; 
int checkingForSearch; 
private bool isRunningForSearch; 

从输出屏幕我越来越

Exception thrown: 'System.Threading.ThreadAbortException' in mscorlib.dll 

感谢。

+0

不清楚是什么问题?如果值是10,它是否工作?当你选择4(或2,5,7)时它有效吗?什么工作,什么没有工作? (正确缩进你的代码会使其他人更容易阅读)。 – codersl

+0

感谢你的回复codersl,问题是我们说,我在datagridview中有50行,但是如果我从numericUpDown中选择10个线程,它只会写入10行,并且不会完成线程并继续到下一行。 – LikePod

+0

啊,我看到了,你的问题是每个线程都传递一个“索引”,它永远不会改变,所以它只会处理一行。我仍然不确定你想要做什么......每个线程应该处理哪些行? – codersl

回答

0

索引计数器未在线程方法中增加。

程序中还有一个重叠的问题,我会让你修复。假设有50个URL,问题是线程1将更新单元格0到49,线程2将更新单元格1到49,等等。

public void MultiThreadMet (object IndexForSearch) 
{     
    int index = (int)IndexForSearch; 

    while (isRunningForSearch) 
    { 
     try 
     { 
      if (index >= dataUrlList.Rows.Count) 
      { 
       return; 
      } 

      DataGridViewRow row = dataUrlList.Rows[index]; 
      index++; 

      //For just test i'm trying to add "test" in every cell[1] in datagridview 
      dataUrlList.Invoke(new Action(() => row.Cells[1].Value = "test")); 
     } 
     catch 
     { 
     }       
    } 
}