winform 分线程更新 UI 控件方式
时间: 2023-07-28 14:10:03 浏览: 69
在 Winform 中,UI 控件只能在主线程中更新。如果在非主线程中更新 UI 控件,会抛出 "跨线程访问无效: 从不是创建控件的线程访问它" 的异常。因此,我们需要使用以下方式在分线程中更新 UI 控件:
1. 使用 Control.Invoke 方法
使用 Control.Invoke 方法可以将代码添加到 UI 线程的消息队列中执行。这样可以保证在 UI 线程中更新控件,避免跨线程访问异常。
示例代码:
```
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(new ThreadStart(UpdateTextBox));
t1.Start();
}
private void UpdateTextBox()
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(new MethodInvoker(delegate {
textBox1.Text = "Hello World";
}));
}
else
{
textBox1.Text = "Hello World";
}
}
```
2. 使用 BackgroundWorker 组件
BackgroundWorker 组件是一个用于执行异步操作的组件,在操作完成后可以安全地更新 UI 控件。它具有一个 ProgressChanged 事件和一个 RunWorkerCompleted 事件,可以在这两个事件中更新 UI 控件。
示例代码:
```
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// 在这里执行耗时的操作
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 在这里更新 UI 控件
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 在这里更新 UI 控件
}
```
以上两种方式都可以在分线程中安全地更新 UI 控件,具体使用哪种方式取决于实际情况。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)