我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#使用BackgroundWorker控件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#使用BackgroundWorker控件

在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示,必要时还要控制后台线程中断当前操作。

在.net中,提供了一个组件BackgroundWorker就是专门解决这个问题的。BackgroundWorker类允许在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。

程序执行步骤:

  • 1、调用BackgroundWorker的RunWorkerAsync()方法,如果后台操作需要参数,在调用RunWorkerAsync()方法时给出参数,在DoWork事件处理程序内部,可以从DoWorkEventArgs.Argument属性中提取该参数。
  • 2、执行DoWork事件,后台需要执行的代码放到DoWork事件里面执行。当调用RunWorkerAsync()方法时,BackgroundWorker通过触发DoWork事件,开始执行后台操作

显示后台操作进度:

为了显示后台操作的执行进度,首先要使WorkerReportsProgress等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。

取消后台操作:

为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。

后台操作完成后,反馈给用户:

当后台操作完成以后,无论是completed 还是cancelled,RunWorkerCompleted()事件都会被触发,通过此方法可以将后台操作的完成结果反馈给用户。RunWorkerCompleted 事件处理函数会在DoWork 事件处理函数返回后被调用。通过它我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。注意,如果想要拿到e.Result,您需要在BGWorker_DoWork方法中设置 e.Result属性另外,通过RunWorkerCompletedEventArgs实例的Cancelled 属性,以判断是否是Cancel操作使得后台操作终止;

从后台操作返回值

在执行DoWork事件时DoWorkEventArgs实例的Result属性,返回值到用户;在RunWorkerCompleted事件里,RunWorkerCompletedEventArgs 实例的Result属性接收值;

创建BackgroundWorkerDemo例子:

  • 1.新建一个windows窗体应用程序,如:BackgroundWorkerDemo
  • 2.拖一个ProgressBar(进度条)和一个BackgroundWorker控件到Form窗体上,界面如图:

后台代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace BackgroundWorkerDemo
{
    public partial class FrmDemo : Form
    {
        //设置生成临时文件的路径
        static string strSaveDir = @"F:\培训";
        public FrmDemo()
        {
            InitializeComponent();

            //显示后台操作的执行进度
            this.bgWork.WorkerReportsProgress = true;
            //可以取消后台正在执行的操作
            this.bgWork.WorkerSupportsCancellation = true;
        }

        /// <summary>
        /// 开始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Start_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(strSaveDir) == false)
            {
                return;
            }
            btn_Start.Enabled = false;
            int count = Convert.ToInt32(this.txt_File.Text.ToString().Trim());
            //设置进度条
            this.proBar.Minimum = 0;
            this.proBar.Maximum = count;
            this.proBar.Value = this.proBar.Minimum;
            //开始执行异步线程,进行后台操作,给后台传递参数
            this.bgWork.RunWorkerAsync(count);
        }

        /// <summary>
        /// 后台操作要处理的任务代码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            //获取从RunWorkerAsync()方法里面传递的参数的值
            int fileCount= Convert.ToInt32(e.Argument);
            Random rand = new Random();
            byte[] buffer = new byte[2048];
            for (int i = 0; i < fileCount; i++)
            {
                try
                {
                    string strFileName = Path.Combine(strSaveDir, i.ToString() + ".tmp");
                    using (var stream = File.Create(strFileName))
                    {
                        int n = 0;
                        int maxByte = 8 * 1024 * 1024;
                        while (n < maxByte)
                        {
                            rand.NextBytes(buffer);
                            stream.Write(buffer, 0, buffer.Length);
                            n += buffer.Length;
                        }
                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
                finally
                {
                    //报告进度
                    this.bgWork.ReportProgress(i + 1);
                    Thread.Sleep(100);
                }

                //判断是否取消了后台操作
                if (bgWork.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                //设置返回值
                e.Result = 234;
            }
        }

        /// <summary>
        /// 更新前台界面进度条
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //获取异步任务的进度百分百
            int val = e.ProgressPercentage;
            this.label2.Text = string.Format("已经生成{0}个文件", val);
            //进度条显示当前进度
            this.proBar.Value = val;
        }

        /// <summary>
        /// 后台操作完成,向前台反馈信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btn_Start.Enabled = true;
            //用户取消操作(e.Cancelled==true,表示异步操作已被取消)
            if (e.Cancelled)
            {
                MessageBox.Show("用户取消后台操作", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("操作完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                //接收返回值
                int result = (int)e.Result;

                MessageBox.Show("返回值:" + result);
            }
        }

        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Cancle_Click(object sender, EventArgs e)
        {
            //调用CancelAsync(),取消挂起的后台操作
            this.bgWork.CancelAsync();
        }
    }
}

运行界面:

操作完成界面:

接收返回值:

取消后台操作:

 到此这篇关于C#使用BackgroundWorker控件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#使用BackgroundWorker控件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中怎么使用BackgroundWorker控件

这篇文章主要介绍了C#中怎么使用BackgroundWorker控件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中怎么使用BackgroundWorker控件文章都会有所收获,下面我们一起来看看吧。在我们
2023-06-29

C#中的backgroundWorker类怎么使用

BackgroundWorker类是C#中用于在后台执行操作的工具类。以下是使用BackgroundWorker类的常见步骤:1. 引入命名空间:```csharpusing System.ComponentModel;```2. 创建Ba
2023-08-15

winform多线程组件BackgroundWorker怎么使用

这篇文章主要介绍了winform多线程组件BackgroundWorker怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇winform多线程组件BackgroundWorker怎么使用文章都会有所收获,
2023-06-30

C#中backgroundWorker类的用法详解

BackgroundWorker类是C#中一个非常常用的多线程类,它可以在后台运行一个操作,并且可以与UI线程进行交互。下面是BackgroundWorker类的用法详解:1. 引入命名空间:在使用BackgroundWorker类之前,需
2023-08-14

C#打印控件的使用

本篇内容主要讲解“C#打印控件的使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#打印控件的使用”吧!WinForm中的打印可通过使用.Net提供的打印类完成,也可以使用C#提供的支持打印的
2023-06-17

C# CheckListBox控件怎么使用

CheckListBox控件是Windows Forms中的一个复选框列表控件,用于显示一系列可选项,并允许用户选择一个或多个选项。要使用CheckListBox控件,需要进行以下步骤:在Windows Forms应用程序的窗体上添加Ch
2023-10-24

C#中如何使用 treeview控件

C#中如何使用 treeview控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C# treeview控件的使用方法步骤之一:首先当窗体加载的时候,我们添加上图中所示的节点。
2023-06-17

C# 中如何使用DataGrid控件

本篇文章为大家展示了C# 中如何使用DataGrid控件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# DataGrid控件与数据绑定C# DataGrid控件的主要目的是实现“数据绑定”(Da
2023-06-18

C#应用ToolStrip控件使用方法

使用ToolStrip控件,首先需要在窗体上添加一个ToolStrip控件。可以通过拖拽方式添加,也可以通过代码方式添加。拖拽方式:1. 打开窗体的设计器视图。2. 在工具箱中找到ToolStrip控件,并拖拽到窗体上。3. 根据需要可以在
2023-08-08

C#cefSharep控件的使用详情

本文主要介绍了C#cefSharep控件的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-30

c#中datagridview控件怎么使用

在C#中,可以通过以下步骤来使用DataGridView控件:1. 在窗体上拖放一个DataGridView控件,或者在代码中动态创建一个DataGridView对象。2. 设置DataGridView的属性。例如,可以设置DataGrid
2023-09-22

C#中如何使用Calendar控件

C#中如何使用Calendar控件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、预备知识在C#中可以开发两种服务器控件,一个是用户控件(User Contr
2023-06-17

c# 中如何使用listbox控件

c# 中如何使用listbox控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。EnhancedListBox属性属性名 类别UPButtonCaption Appearanc
2023-06-18

C#中如何使用Timer控件

这篇文章将为大家详细讲解有关C#中如何使用Timer控件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。打开"工具箱"---右键---"选择项"---找到Timer控件,看好了,这个Timer
2023-06-17

c#中tooltip控件怎么使用

在C#中,可以通过使用ToolTip控件来为其他控件添加提示信息。以下是使用ToolTip控件的一般步骤:在Windows窗体中添加ToolTip控件:ToolTip toolTip1 = new ToolTip();将ToolTip控件与
c#中tooltip控件怎么使用
2024-03-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录