WinForm BackgroundWorker笔记

本文介绍了如何在C# WinForm应用中使用BackgroundWorker组件处理耗时操作,避免UI线程阻塞。通过实例展示了BackgroundWorker的使用方法,包括DoWork、ProgressChanged和RunWorkerCompleted事件,以及如何安全地跨线程访问控件。
摘要由CSDN通过智能技术生成

前言

在C#的WinForm程序中,有的时候我们会需要一些耗时比较长的操作,比如拷贝文件,下载大文件,或者其他什么耗时比较长的操作,这个时候如果把这些操作都放在主线程(UI线程)中,那么就会造成主线程需要先将耗时操作完成再响应界面的问题。

需求说明

假设我们目前有如下的界面,界面上两个按钮Button,一个文本框TextBox,一个标签Label和一个进度条ProgressBar。现在有如下的要求,当我们点下Start时,从1~100令进度条开始填充。然后标签可以实时显示进度条的值。
界面

代码部分如下,很简单的功能。

        private void btnStart_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                pgbTest.PerformStep();
                lblTest.Text = pgbTest.Value.ToString();
                Thread.Sleep(200);//这里我们每次循环时等待200毫秒来模拟耗时操作。
            }
        }

运行预览

预览
可以看到效果没有达到预期的那样,同时在进度条填充的过程中其他控件也无法操作。用平常的话说就会变得很“卡”。这种时候就会一般就会用到多线程来解决。但是其实微软已经很贴心的为我们封装好了一个组件,那不如直接来用一下。

BackgroundWorker

简介

引用微软官方文档中的注释:
The BackgroundWorker class allows you to run an operation on a separate, dedicated thread. Time-consuming operations like downloads and database transactions can cause your user interface (UI) to seem as though it has stopped responding while they are running. When you want a responsive UI and you are faced with long delays associated with such operations, the BackgroundWorker class provides a convenient solution.
To set up for a background operation, add an event handler for the DoWork event. Call your time-consuming operation in this event handler. To start the operation, call RunWorkerAsync. To receive notifications of progress updates, handle the ProgressChanged event. To receive a notification when the operation is completed, handle the RunWorkerCompleted event.
渣翻见谅:
BackgroundWorker类允许用户在专门且独立于主线程的线程上进行操作。当用户执行一些类似下载或者数据库事物的耗时操作时,可能会让界面UI产生类似停止响应的现象。当用户需要执行类似的耗时操作,且同时需要界面UI及时响应时,BackgroundWorker类提供了一个十分便捷的解决方案。
要执行一个后台操作,可以注册DoWork事件,并在此事件中实现耗时操作。然后,如果想要开始任务,可以调用RunWorkAsync方法。如希望接收进度变化提示,可以注册ProgressChanged事件。如希望在操作完成时接收提示,可以注册

WinForm BackgroundWorker是一个用于多线程处理的类。它主要用于在WinForm应用程序中执行长时间运行的任务,以避免阻塞主线程,使应用程序更加流畅和响应。 BackgroundWorker内置了几个关键事件:DoWork,ProgressChanged和RunWorkerCompleted。DoWork事件是用于执行后台工作的地方,我们可以在这个事件中编写长时间运行的代码。ProgressChanged事件用于向主线程报告后台工作的进度,可以在其中更新UI。RunWorkerCompleted事件在后台工作完成后触发,可以在其中处理后台工作完成后的逻辑。 通过BackgroundWorker,我们可以方便地实现异步任务的执行和UI更新,另外它还提供了一些属性和方法,如CancellationPending属性可以用于取消后台任务,ReportProgress方法用于报告后台任务的进度。 在使用BackgroundWorker时,我们需要注意一些问题。首先,长时间运行的任务应该放在DoWork事件中,以避免阻塞主线程。在DoWork事件中,我们可以通过e.Argument属性获取传递给后台任务的参数,通过e.Result属性返回后台任务的结果。 其次,使用ReportProgress方法来报告后台任务的进度,以便在ProgressChanged事件中更新UI。此外,我们还可以使用取消操作来停止后台任务的执行,可以在DoWork事件中检查CancellationPending属性来判断是否需要取消任务。 WinForm BackgroundWorker作为一个强大的多线程处理类,大大简化了多线程编程的复杂性,提供了方便的接口来执行长时间运行的任务,并且保持界面的响应性。它在传统的WinForm应用程序中具有广泛的应用,使得我们可以轻松实现后台任务的执行和UI的更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值