如何使用线程来更新主线程动态变化的DataTable?

时间:2013-09-12 08:04:02

标签: c# winforms

有一个dataTable用来点击按钮填写“搜索”。在dataTable填充数据时单击此按钮。我正在创建一个新的线程,它在dataTable数据上更新。但是用户再次单击了搜索按钮。现在,当一个线程已经更新了dataTable时,dataTable再次填充了新数据。在搜索上单击代码再次创建一个新线程并开始更新已更改的dataTable。这里我遇到错误:跨线程操作无效:控制''从其创建的线程以外的线程访问。请提出解决方案。感谢

2 个答案:

答案 0 :(得分:2)

  1. 检查您正在更新的控件上的InvokeRequired,然后在必要时执行Invoke或BeginInvoke
  2. 如果更新已在进行中,则禁用按钮和/或禁用新更新
  3. 用于更新DataGridView的DataSource:

    if(DGV.InvokeRequired)
    DGV.Invoke(new EventHandler(delegate
    {
         DGV.DataSource= currentDataTable;
    }));
    else DGV.DataSource= currentDataTable;
    

    如果你正在从另一个线程更新并在那里设置currentDataTable,也许你应该考虑创建一个事件,当你的更新完成时,它将触发并更新你的GUI(或者你完成工作 - 如果你正在使用BackgroundWOrker) - 那时没有必要调用。

答案 1 :(得分:0)

您可以将搜索按钮指定给

btn.Enabled = false;

单击它并调用方法时,将在搜索结束时重新启用它

如果您不想禁用此按钮,则可以使用此代码

private BackgroundWorker trd;

private void button1_Click(object sender, EventArgs e)
{
   if (trd != null)
   {
      trd.CancelAsync();
   }

   trd = new BackgroundWorker();
   trd.DoWork += new DoWorkEventHandler(trd_DoWork);
   trd.WorkerSupportsCancellation = true;
   trd.RunWorkerAsync();
}

public void trd_DoWork(object sender, DoWorkEventArgs e)
{
     // Your search code
}

以这种方式中止线程并重新启动它。搜索在中间停止,不会使用其他后台工作程序编辑值。后台工作者正在编辑值意味着不会有交叉线程,因为您不知道其他线程,但UI线程可以编辑UI