这里我正在做一个检查用户名的过程。我创建了一个 datagridview 并从文本文件加载了数据。因此 datagridview 在前两列中包含用户的名字和姓氏。我需要做的是逐行读取这些值,并发现第一个和最后一个没有相同的名称。这些操作是在单独的类中执行的。所以我需要从该类获取结果并将结果显示给 gridview 。当我只使用一个线程时,一切正常。但是,当我使用多个线程时,它只会抛出一个异常,即 gridview 读取中的 outofbound 异常。这是我的编码:
static int i, j=0, l=0,k=0,m=0;
public void check()
{
for (i = 0; i < dataGridView1.Rows.Count ; i++)
{
if (InvokeRequired)
{
Invoke(new UpdateDelegate(delegate
{
if (i == 0 && j==0)
{
DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.HeaderText = "Status";
int colIndex = dataGridView1.Columns.Add(col);
dataGridView1.Rows[i].Cells[colIndex].Value = "Process Started";
j = 1;
}
else
{
dataGridView1.Rows[i].Cells[3].Value = "process Started";
}
}));
}
if (InvokeRequired)
{
Invoke(new UpdateDelegate(delegate
{
Process obj_reg = new Process(dataGridView1.Rows[i].Cells[1].Value.ToString(),dataGridView1.Rows[i].Cells[2].Value.ToString());
string res = obj_reg.register();
Thread.Sleep(500);
if (res.Contains("success"))
{
if (i == 0 && k==0)
{
DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.HeaderText = "Result";
int colIndex = dataGridView1.Columns.Add(col);
dataGridView1.Rows[i].Cells[colIndex].Value = "Ya its different";
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Green;
k = 1;
}
else
{
dataGridView1.Rows[i].Cells[4].Value = "Ya its different";
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Green;
}
}
else
{
if (i == 0 && m == 0)
{
DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.HeaderText = "Result";
int colIndex = dataGridView1.Columns.Add(col);
dataGridView1.Rows[i].Cells[colIndex].Value = "No its same";
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Red;
m = 1;
}
else
{
dataGridView1.Rows[i].Cells[4].Value = "No its same";
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
}
}));
}
}
}
public void Button1_Click(Object sender, EventArgs e)
{
Thread[] threads = new Thread[3];
for (int l = 0; l < 3; l++)
{
threads[l] = new Thread(new ThreadStart(check));
}
foreach (Thread t in threads)
{
t.Start();
}
}
请建议我如何在这里使用多线程...这只是一个例子..请解释任何其他方式..
这段代码有几个问题。
您正在访问DataGridView
来自工作线程。从第一行代码可以明显看出这一点check
。你根本无法做到这一点。
您定义了变量i
, j
, l
,并且大概k
and m
(尽管我没有看到它们在任何地方声明)为静态的。结果是每个工作线程都将使用相同的值并互相干扰。这是一个更大的问题i
因为它实际上是从工作线程访问的。其他的可以从编组到 UI 线程上的匿名委托进行访问。尽管如此,这可能会引起很多混乱,因为匿名委托的执行顺序是不可预测的。
你正在呼唤Invoke
来自工作线程。这本身并不是问题。但是,考虑到您将所有有用的工作重新整合到 UI 线程上,这是毫无意义的。想一想。您完成了所有工作以使用工作线程,然后将所有内容封送回 UI 线程。现在您有了一个比根本不使用任何工作线程更糟糕的解决方案。
这实际上不是一个问题,但更多的是我的抱怨。何必打电话麻烦InvokeRequired
?您已经知道“调用”是必需的,因为您在开发时知道这些东西位于工作线程上。
我的建议如下。
根本不要使用线程。在这种情况下这是没有意义的。可以在另一个线程上执行的唯一有用的工作是比较名字和姓氏。这很简单,并且可以在 UI 线程上同样快速地完成。
如果你真的想使用单独的线程那么你have读取值DataGridView
在UI线程上并将它们放在单独的数据结构中;可以从另一个线程安全使用的一个。最好将这个数据结构与DataGridView
这样,当需要启动长时间运行的操作时,您将不需要读取网格,因为您已经将数据复制到这个单独的数据结构中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)