我试图将我的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
感谢。
不清楚是什么问题?如果值是10,它是否工作?当你选择4(或2,5,7)时它有效吗?什么工作,什么没有工作? (正确缩进你的代码会使其他人更容易阅读)。 – codersl
感谢你的回复codersl,问题是我们说,我在datagridview中有50行,但是如果我从numericUpDown中选择10个线程,它只会写入10行,并且不会完成线程并继续到下一行。 – LikePod
啊,我看到了,你的问题是每个线程都传递一个“索引”,它永远不会改变,所以它只会处理一行。我仍然不确定你想要做什么......每个线程应该处理哪些行? – codersl