在使用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/

10-13 04:58