iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中怎么使用BackgroundWorker控件
  • 936
分享到

C#中怎么使用BackgroundWorker控件

2023-06-29 07:06:44 936人浏览 薄情痞子
摘要

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

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

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

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

程序执行步骤:

  • 调用BackgroundWorker的RunWorkerAsync()方法,如果后台操作需要参数,在调用RunWorkerAsync()方法时给出参数,在DoWork事件处理程序内部,可以从DoWorkEventArgs.Argument属性中提取该参数。

  • 执行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例子:

  • 新建一个windows窗体应用程序,如:BackgroundWorkerDemo

  • 拖一个ProgressBar(进度条)和一个BackgroundWorker控件到FORM窗体上,界面如图:

C#中怎么使用BackgroundWorker控件

后台代码:

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控件

操作完成界面:

C#中怎么使用BackgroundWorker控件

接收返回值:

C#中怎么使用BackgroundWorker控件

取消后台操作:

C#中怎么使用BackgroundWorker控件

关于“C#中怎么使用BackgroundWorker控件”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#中怎么使用BackgroundWorker控件”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: C#中怎么使用BackgroundWorker控件

本文链接: https://www.lsjlt.com/news/323344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C#中怎么使用BackgroundWorker控件
    这篇文章主要介绍了C#中怎么使用BackgroundWorker控件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中怎么使用BackgroundWorker控件文章都会有所收获,下面我们一起来看看吧。在我们...
    99+
    2023-06-29
  • C#使用BackgroundWorker控件
    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界...
    99+
    2024-04-02
  • C#中的backgroundWorker类怎么使用
    BackgroundWorker类是C#中用于在后台执行操作的工具类。以下是使用BackgroundWorker类的常见步骤:1. ...
    99+
    2023-08-15
    C#
  • c#中使用BackgroundWorker的实现
    在客户端中,为了防止界面假死状态,或者不能拖动界面,可以使用BackgroundWorker。 1.在界面上拖动一个BackgroundWorker,label,进度条和2个butt...
    99+
    2024-04-02
  • c#中tooltip控件怎么使用
    在C#中,可以通过使用ToolTip控件来为其他控件添加提示信息。以下是使用ToolTip控件的一般步骤: 在Windows窗体中...
    99+
    2024-03-04
    c# tooltip
  • c#中datagridview控件怎么使用
    在C#中,可以通过以下步骤来使用DataGridView控件:1. 在窗体上拖放一个DataGridView控件,或者在代码中动态创...
    99+
    2023-09-22
    c#
  • C#中iocomp控件怎么使用
    Iocomp是一个用于创建数据监视和数据采集的控件库。以下是在C#中使用Iocomp控件的一般步骤:1. 下载并安装Iocomp控件...
    99+
    2023-09-21
    C#
  • winform多线程组件BackgroundWorker怎么使用
    这篇文章主要介绍了winform多线程组件BackgroundWorker怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇winform多线程组件BackgroundWorker怎么使用文章都会有所收获,...
    99+
    2023-06-30
  • c#中的textbox控件怎么使用
    TextBox控件是用于在Windows Form应用程序中显示和编辑文本的控件。下面是使用TextBox控件的基本步骤:1. 在W...
    99+
    2023-06-13
    textbox控件
  • C#中winform chart控件怎么使用
    在C#中使用WinForms Chart控件,可以按照以下步骤进行操作: 在Visual Studio中创建一个WinForms应...
    99+
    2024-02-29
    C# winform
  • C#中BackgroundWorker类用法总结
    目录1、属性:WorkerReportsProgress WorkerSupportsCancellation CancellationPending IsBusy 2、方法:Run...
    99+
    2024-04-02
  • C# CheckListBox控件怎么使用
    CheckListBox控件是Windows Forms中的一个复选框列表控件,用于显示一系列可选项,并允许用户选择一个或多个选项。...
    99+
    2023-10-24
    C#
  • C# CheckedListBox控件怎么使用
    CheckedListBox控件是Windows窗体应用程序中常用的控件,用于显示一个带有复选框的列表。用户可以通过勾选或取消勾选复...
    99+
    2024-04-02
  • c中datagridview控件属性怎么使用
    DataGridView控件是C#中的一个用于展示和编辑数据的控件。下面是一些常用的DataGridView控件属性及其用法:1. ...
    99+
    2023-08-08
    c datagridview
  • C#中TextBox控件怎么用
    这篇文章主要介绍了C#中TextBox控件怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。大家知道茬某些特殊情况下,我们有时候需要让户在文本框中只能输入数字,那我们怎么实...
    99+
    2023-06-17
  • C#中CheckedListBox控件怎么用
    这篇文章给大家分享的是有关C#中CheckedListBox控件怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常用属性、方法和事件1.常用属性(1)CheckOnClick属性CheckOnClick属...
    99+
    2023-06-25
  • C#中propertygrid控件怎么自定义使用
    要自定义使用C#中的PropertyGrid控件,您可以使用以下步骤:1. 创建一个Windows窗体应用程序或者一个自定义控件。2...
    99+
    2023-10-10
    C#
  • DataGridView控件怎么在C#项目中使用
    DataGridView控件怎么在C#项目中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1) 创建课程信息表创建课程信息表的 SQL 语句如下。use&n...
    99+
    2023-06-08
  • C#中backgroundWorker类的用法详解
    BackgroundWorker类是C#中一个非常常用的多线程类,它可以在后台运行一个操作,并且可以与UI线程进行交互。下面是Bac...
    99+
    2023-08-14
    C#
  • winform多线程组件BackgroundWorker使用
    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。 可以通过编程方式创建 BackgroundWorke...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作