在使用C#表单程序时,我遇到了非常烦人的问题,如下所示:
假设我有一个与数据库链接的DataGridView
,当然我必须做一些操作,例如插入,修改甚至删除。
如果这些操作在thread
主代码中完成,则该表单将按操作要求暂停几秒钟,因此我将这些操作分别写在单独的线程中,并且现在效果良好。但是,如果在线程内部,我想做一些必要的操作诸如DataGridView行选择之类的代码,它将弹出一个cross-thread exception
,我做了一个小技巧,使用this.invoke()
这样做,例如:
new thread( () => {
// some operation code here such insert query, then...
//search in DataGridView and highlight the result
this.Invoke(new MethodInvoker(delegate
{
var i = 0;
foreach (DataGridViewRow r in dataGridView1.Rows)
{
if (r.Cells[1].Value.ToString().Equals(FirstName) && r.Cells[2].Value.ToString().Equals(LastName))
{
r.Selected = true;
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[1];
}
i++;
}
}));
}).start();
然后,我问这样做
invoke
使用是否会损害我的代码并可能导致无法预测的序列,或者这是完全安全的?另一个解决方案是什么? 最佳答案
这是处理此问题的最常用方法。话虽这么说,如果您创建的Thread
除了将Invoke
返回到UI线程之外没有执行任何操作(即:您的所有工作都在Invoke
内部),它将仍然阻塞UI,并且完全没有任何好处。
但是,如果在线程上进行数据库插入/删除/等操作,并且仅在小部分中调用Invoke
,则这将提供一种安全的方式来处理该问题。
关于c# - 在表单中的新线程内使用invoke,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24392464/