在后台工作者和主线程之间进行通信
本文关键字:之间 通信 线程 后台 工作者 | 更新日期: 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
.