0

我想知道如何在不冻结我的 UI 的情况下启动我的服务器连接(只需单击 2 秒的简单按钮),并且在建立连接后更新我的 UI,我可以通过BackgroundWorker和内部worker_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,这是一种常见且正确的做法吗?有一种方法可以在不同的线程中启动某些东西,并且在该线程结束后保留​​到主线程?

4

1 回答 1

3

您不需要Invoke以下回调:

  • ProgressChanged
  • RunWorkerCompleted

在这里,您可以毫无问题地直接访问 UI 元素。其余的需要Invoke

于 2013-09-27T08:54:18.927 回答