0

0

c# backgroundworker 用法

畫卷琴夢

畫卷琴夢

发布时间:2026-01-06 08:05:03

|

124人浏览过

|

来源于php中文网

原创

BackgroundWorker 是 WinForms 专用的 UI 安全异步协调器,DoWork 中不可访问 UI 控件,须通过 ReportProgress 触发 ProgressChanged 更新界面;取消需手动检查 CancellationPending 并设 e.Cancel = true;ProgressChanged 和 RunWorkerCompleted 自动在 UI 线程执行。

c# backgroundworker 用法

BackgroundWorker 不是“后台线程封装”,而是 WinForms 专用的 UI 安全异步协调器——它只在 Windows Forms 里真正好用,且必须配合事件驱动模式。

DoWork 里不能碰任何 UI 控件

这是最常踩的坑:你在 backgroundWorker1_DoWork 里写 label1.Text = "正在计算...",程序不报错但会抛 InvalidOperationException: 跨线程操作无效。因为 DoWork 运行在独立工作线程,而 WinForms 控件只能由创建它的 UI 线程访问。

  • ✅ 正确做法:用 ReportProgress(int percentage, object userState) 发消息,让 ProgressChanged 事件在 UI 线程中更新控件
  • ❌ 错误写法:textBox1.Text = "done"progressBar1.Value++ 出现在 DoWork
  • ⚠️ 注意:e.Argument 是唯一安全传参入口,类型为 object,需手动强转(如 (int)e.Argument

取消操作不是“立刻停止”,而是协作式退出

CancelAsync() 只是设个标记,真正中断逻辑靠你手写检查 bw.CancellationPending 并主动退出循环或 return。

VisualizeAI
VisualizeAI

用AI把你的想法变成现实

下载
  • ✅ 必须在耗时操作内部定期检查:if (bw.CancellationPending) { e.Cancel = true; return; }
  • e.Cancel = true 是给 RunWorkerCompleted 事件用的判断依据,不设它就无法区分“完成”和“取消”
  • ❌ 不检查 CancellationPending → 点取消按钮毫无反应,直到任务自然结束
  • ⚠️ Sleep、IO、数据库查询等阻塞调用中,CancellationPending 不会自动生效,需改用支持取消的 API(如 HttpClient.GetAsync(..., cancellationToken)

ProgressChanged 和 RunWorkerCompleted 是 UI 线程安全的

这两个事件由 BackgroundWorker 自动封送到 UI 线程,你可以放心操作所有控件。

  • ✅ 在 ProgressChanged 中直接更新:progressBar1.Value = e.ProgressPercentagelabel1.Text = (string)e.UserState
  • ✅ 在 RunWorkerCompleted 中统一收尾:if (e.Cancelled) {...}if (e.Error != null) {...}resultLabel.Text = e.Result?.ToString()
  • ⚠️ e.Result 是你在 DoWork 中赋值的 e.Result = "OK",类型为 object,记得判空和转型
  • ⚠️ 如果 DoWork 抛异常,不会崩掉 UI,但会进 RunWorkerCompletede.Error 分支,不处理就会静默失败
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var bw = sender as BackgroundWorker;
    int max = (int)e.Argument;
    for (int i = 0; i <= max; i++)
    {
        if (bw.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
        bw.ReportProgress(i * 100 / max, $"第 {i} 步");
        Thread.Sleep(50); // 模拟耗时
    }
    e.Result = $"总计 {max} 次";
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; statusLabel.Text = e.UserState?.ToString(); }

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) statusLabel.Text = "已取消"; else if (e.Error != null) statusLabel.Text = "出错了:" + e.Error.Message; else statusLabel.Text = "结果:" + e.Result?.ToString(); }

真正难的不是写这几行代码,而是理解它背后的设计契约:BackgroundWorker 不帮你管理线程生命周期,也不替你处理并发,它只保证三件事——DoWork 在后台跑、Progress/Completed 回 UI 线程、Cancellation 是合作而非强制。一旦离开 WinForms(比如用在 WPF 或控制台),这套机制就失效了,该换 Task + async/await 了。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

719

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

528

2024.08.29

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.7万人学习

Excel 教程
Excel 教程

共162课时 | 11万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号