在表单中的新线程中使用invoke

时间:2014-06-24 17:07:57

标签: c# multithreading invoke

在处理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是否会损害我的代码并可能导致不可预测的序列或者它是完全安全的?什么是另一种解决方案?

1 个答案:

答案 0 :(得分:4)

  

然后我问这个调用用法是否会损害我的代码并可能导致不可预测的序列或者它是完全安全的?什么是另一种解决方案?

这是处理此问题的最常用方法。话虽这么说,如果你创建的Thread除了Invoke之外什么都不做,回到UI线程(即:你的所有工作都在Invoke内),它仍会阻止UI ,并没有提供任何好处。

但是,如果你在线程上进行数据库插入/删除/等操作,并且只在小部分中调用Invoke,这将提供一种安全的方法来处理它。