在BackgroundWorker和主线程之间进行通信

时间:2013-09-27 08:51:26

标签: c# multithreading winforms

我想知道如何在没有我的UI冻结的情况下启动我的服务器连接(简单按钮点击需要2秒),并且在建立连接后更新我的UI,我可以通过BackgroundWorkerworker_RunWorkerCompleted event内部来实现更新我的UI,但因为这是不同的线程,我需要使用Invoke

 private void btnConnect_Click(object sender, EventArgs e)
{
    btnConnect.Enabled = false;
    BackgroundWorker worker = new BackgroundWorker();
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.DoWork += worker_DoWork;
    worker.RunWorkerAsync();
}

开始做工作并连接:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        // Establish the connection...
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

建立连接后更新我的UI:

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Update UI
}

我的问题是我可以避免使用调用吗? 因为在我的应用程序中我有几点我需要添加,删除,更新标签,DatagridView,这样我会多次使用Invoke,这是一个常见的,适当的做到这一点? 有一种方法可以在不同的线程中启动一些东西并在此线程结束后保留​​到主线程中吗?

1 个答案:

答案 0 :(得分:3)

以下回调中您不需要Invoke

  • ProgressChanged
  • RunWorkerCompleted

在这里,您可以直接访问UI元素而不会出现问题。其余的需要Invoke