在后台工作者和主线程之间进行通信

本文关键字:之间 通信 线程 后台 工作者 | 更新日期: 2023-09-27 18:32:57

我想知道如何启动我的服务器连接(简单的按钮单击需要 2 秒(而不会冻结我的 UI,并且在建立连接后更新我的 UI,我可以通过 BackgroundWorker 和内部更新我的 UI worker_RunWorkerCompleted event但因为这是不同的线程,我需要使用 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,这是常见且合适的做法吗?有一种方法可以在不同的线程中启动某些内容,并且在此线程结束之后仍保留在主线程上?

在后台工作者和主线程之间进行通信

以下回调中不需要Invoke

  • ProgressChanged
  • RunWorkerCompleted

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