繁体   English   中英

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

[英]Communicate between BackgroundWorker and main thread

我想知道如何在不冻结我的UI的情况下启动服务器连接(单击按钮只需2秒钟),并且在建立连接后更新了我的UI,我可以通过BackgroundWorker并且在worker_RunWorkerCompleted event内部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
}

我的问题是我可以避免使用invoke吗? 因为在我的应用程序中,我需要添加,删除,更新标签,DatagridView几个要点,因此我将多次使用Invoke ,这是常见的做法吗? 有一种方法可以在其他线程中启动某项,并且在此线程结束后仍保留在主线程中?

你不需要Invoke下面的回调:

  • ProgressChanged
  • RunWorkerCompleted

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM