C# winform多线程的小例子
时间: 2023-07-29 13:07:05 浏览: 155
以下是一个简单的 C# WinForm 多线程的例子,它使用了 BackgroundWorker 组件来实现多线程处理任务:
1. 在 WinForm 窗体中添加一个按钮和一个 Label 控件。
2. 双击按钮控件,打开 Click 事件处理程序。
3. 在事件处理程序中添加以下代码:
```csharp
private void button1_Click(object sender, EventArgs e)
{
// 启动后台任务
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// 模拟一个长时间运行的任务
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 更新 Label 控件的显示内容
label1.Text = $"已完成 {e.ProgressPercentage}%";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 显示任务完成提示
MessageBox.Show("任务已完成!");
}
```
4. 在窗体的构造函数中,添加以下代码:
```csharp
public Form1()
{
InitializeComponent();
// 启用支持多线程的控件样式
Control.CheckForIllegalCrossThreadCalls = false;
// 配置 BackgroundWorker 组件
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = false;
}
```
以上代码的作用如下:
- 当用户单击按钮时,启动后台任务;
- 后台任务模拟一个长时间运行的任务,每隔一段时间更新一次进度;
- 当进度更新时,更新 Label 控件的显示内容;
- 当任务完成时,弹出一个提示框。
需要注意的是,在多线程应用程序中,UI 线程和后台线程是分别运行的,不能直接访问 UI 控件。为了避免出现访问冲突,可以启用支持多线程的控件样式,并使用 Invoke 或 CheckForIllegalCrossThreadCalls 属性来解决这个问题。
阅读全文