iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >winform多线程组件BackgroundWorker怎么使用
  • 435
分享到

winform多线程组件BackgroundWorker怎么使用

2023-06-30 13:06:33 435人浏览 安东尼
摘要

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

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

BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。

可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

常用方法

  • RunWorkerAsync 开始执行后台操作。引发 DoWork 事件。
       public void RunWorkerAsync(); //启动线程,触发DoWork事件
       public void RunWorkerAsync(object argument);

  • CancelAsync 请求取消挂起的后台操作。
    注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查CancellationPending 属性,来决定是否要继续执行耗时的操作。

  • ReportProgress引发 ProgressChanged 事件。
       public void ReportProgress(int percentProgress); //报告进度,触发ProgressChanged事件
       public void ReportProgress(int percentProgress, object userState);

常用属性

  • IsBusy:  //只读属性,用来判断当前线程是否正在工作中。

  • CancellationPending: 指示应用程序是否已请求取消后台操作。只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

  • WorkerSupportsCancellation:指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

  • WorkerReportsProgress:指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。

常用事件

  • DoWork: 调用 RunWorkerAsync 方法时发生。

  • ProgressChanged:可选,调用 ReportProgress 方法时发生。

  • RunWorkerCompleted:可选,后台操作已完成、被取消或引发异常时发生。

注意:在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和RunWorkerCompleted 事件与用户界面进行通信。

如果想在 DoWork 事件处理程序中和用户界面的控件通信,可在用 ReportProgress 方法。ReportProgress(int percentProgress, object userState),可以传递一个对象。ProgressChanged 事件可以从参数ProgressChangedEventArgs 类的UserState 属性得到这个信息对象。这个事件也可以实现进度条功能,把任务的进度实时呈现给用户。

简单的程序用BackgroundWorker 比 Thread 方便,Thread中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或BeginInvoke 方法,没有 BackgroundWorker 方便。

使用backgroundWorker步骤

  • 新建BackgroundWorder对象;

  • 根据需求, 设置是否能取消(WorkerSupportsCancellation)、是否报告进度(WorkerReportsProgress);

  • 根据需求,设置好相关事件,DoWorker、ProgressChanged、ProgressChanged;

  • 调用RunWorkerAsyns()方法,启动线程;

  • 在需要取消的位置,判断CancellationPending的值,并做相关处理;//可选

  • 在适当的位置调用ReportProgress(int percentProgress)方法,报告进度。

BackgroundWorker实例

    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            backgroundWorker1.WorkerReportsProgress = true;//报告完成进度            backgroundWorker1.WorkerSupportsCancellation = true;//允许用户终止后台线程                                                                //绑定事件            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);        }        //开始按钮        private void button1_Click(object sender, EventArgs e)        {            if (!backgroundWorker1.IsBusy)//判断backgroundWorker1是否正在运行异步操作            {                backgroundWorker1.RunWorkerAsync(1000);//开始执行后台异步操作,调用DoWork事件            }            while (backgroundWorker1.IsBusy)//等待后台运行完毕            {                Application.DoEvents();            }            MessageBox.Show("操作完成");        }        //取消按钮        private void button2_Click(object sender, EventArgs e)        {            if (backgroundWorker1.WorkerSupportsCancellation == true)            {                backgroundWorker1.CancelAsync();//取消后台操作                backgroundWorker1.Dispose();//释放资源            }        }        //DoWork事件声明要执行的耗时操作        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)        {            BackgroundWorker backgroundWorker = sender as BackgroundWorker;            e.Result = ListNumber(backgroundWorker, e);//运算结果保存在e.Result中(在RunWorkerCompleted事件可能会使用到)        }        bool ListNumber(object sender, DoWorkEventArgs e)        {            int num = (int)e.Argument;//接收传入的参数,即RunWorkerAsync(object argument)传入的值            for (int i = 1; i <= num; i++)            {                if (backgroundWorker1.CancellationPending)//判断是否请求了取消后台操作,如果为false则退出                {                    e.Cancel = true;//e.Cancel 是否应该取消事件                    return false;                }                Thread.Sleep(10);//执行一个耗时操作                backgroundWorker1.ReportProgress(i * 100 / num, i);//报告完成进度            }            return true;        }        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)        {            progressBar1.Value = e.ProgressPercentage;//将完成进度数据传给进度条            label1.Text = e.ProgressPercentage + "%";            //将中间计算结果在ListBox控件中显示出来            listBox1.Items.Add(e.UserState);//接收ReportProgress方法传递过来的userState        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)        {            if (e.Cancelled == true) //e.Cancelled指示异步操作是否已被取消            {                MessageBox.Show("Canceled!");            }            else if (e.Error != null) //e.Error 指示异步操作期间发生的错误            {                MessageBox.Show("Error: " + e.Error.Message);            }            else            {                MessageBox.Show(e.Result.ToString());  //e.Result 获取异步操作结果的值,即DoWork事件中,Result设置的值。            }        }    }

对Winform窗体控件进行安全调用

(WinForm中实现多线程的首选方法是backgroundWorker)

Thread thread = new Thread(SetLabel);//另开一个线程上设置Label的属性thread.Start(); delegate void Action(string args);//Net3.5自带的Action无参数无返回值private void SetLabel(){    Action action = delegate (string args)    {        this.label1.Text = args;    };    if (this.InvokeRequired)//判断当前代码是运行于创建该控件的线程之上,还是运行于另一个线程之上。        this.Invoke(action, "XXX");//注意控件的Inovoke和BeginInvoke委托的方法都执行在UI线程上。对Control的Invoke方法可以使用一个简单的系统委托MethodInvoker无参数返回Void调用。    else        action("XXX");}

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

--结束END--

本文标题: winform多线程组件BackgroundWorker怎么使用

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

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

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

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

下载Word文档
猜你喜欢
  • winform多线程组件BackgroundWorker怎么使用
    这篇文章主要介绍了winform多线程组件BackgroundWorker怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇winform多线程组件BackgroundWorker怎么使用文章都会有所收获,...
    99+
    2023-06-30
  • winform多线程组件BackgroundWorker使用
    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。 可以通过编程方式创建 BackgroundWorke...
    99+
    2024-04-02
  • C#中怎么使用BackgroundWorker控件
    这篇文章主要介绍了C#中怎么使用BackgroundWorker控件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中怎么使用BackgroundWorker控件文章都会有所收获,下面我们一起来看看吧。在我们...
    99+
    2023-06-29
  • winform实时曲线图控件怎么使用
    要使用Winform实时曲线图控件,你可以按照以下步骤进行操作: 在Visual Studio中创建一个新的Winform应用程序...
    99+
    2023-10-26
    winform
  • winform跨线程访问控件怎么实现
    在WinForm中,如果要在一个线程中访问另一个线程中的控件,可以使用Control类的Invoke方法或BeginInvoke方法...
    99+
    2023-09-13
    winform
  • wpf怎么使用winform控件
    WPF(Windows Presentation Foundation)是一种用于构建 Windows 桌面应用程序的技术,而 Wi...
    99+
    2023-09-26
    WPF winform
  • C# winform跨线程操作控件怎么实现
    今天小编给大家分享一下C# winform跨线程操作控件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提...
    99+
    2023-07-02
  • Python多线程怎么使用
    本篇内容主要讲解“Python多线程怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python多线程怎么使用”吧!Python 多线程多线程类似于同时执行多个不同程序,多线程运行有如下优...
    99+
    2023-06-21
  • PHP 怎么使用多线程
    PHP 语言本身不支持多线程编程。但是,我们可以使用 PHP 的多进程技术来实现多线程的效果。 常用的方法是使用 pcntl 扩展来实现。首先,我们需要在 PHP 中使用 pcntl_fork() 函数来创建子进程。然后,在子进程中使用...
    99+
    2023-09-05
    php 开发语言
  • Spring多线程怎么使用
    这篇“Spring多线程怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring多线程怎么使用”文章吧。为什么使用...
    99+
    2023-06-30
  • winform列表控件怎么使用
    WinForm中的列表控件可以使用ListBox、ListView和DataGridView三种控件来实现。1. ListBox控件...
    99+
    2023-09-05
    winform
  • winform控件之BindingNavigator怎么使用
    WinForm控件之BindingNavigator是用于简化数据绑定操作的控件。它提供了导航、编辑、保存、删除等常用操作的按钮,使...
    99+
    2023-09-29
    winform
  • Java中怎么使用线程组
    这篇文章主要介绍“Java中怎么使用线程组”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中怎么使用线程组”文章能帮助大家解决问题。Java中线程组(Thre...
    99+
    2024-04-02
  • C#中的backgroundWorker类怎么使用
    BackgroundWorker类是C#中用于在后台执行操作的工具类。以下是使用BackgroundWorker类的常见步骤:1. ...
    99+
    2023-08-15
    C#
  • java怎么使用线程池启动多线程
    在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
    99+
    2023-09-15
    java
  • C#中winform chart控件怎么使用
    在C#中使用WinForms Chart控件,可以按照以下步骤进行操作: 在Visual Studio中创建一个WinForms应...
    99+
    2024-02-29
    C# winform
  • go语言多线程怎么使用
    在Go语言中,可以使用goroutine来实现多线程的功能。goroutine是Go语言中的轻量级线程,它可以在一个程序中同时执行多...
    99+
    2023-08-31
    go语言
  • Java多线程之锁怎么使用
    本篇内容介绍了“Java多线程之锁怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先强调一点:Java多线程的锁都是基于对象的,Ja...
    99+
    2023-07-05
  • java使用多线程的条件是什么
    使用多线程的条件有以下几个:1. 程序需要并发执行多个任务或同时处理多个请求。2. 程序中存在可分解为独立子任务的任务集合。3. 程...
    99+
    2023-09-26
    java
  • WinForm中怎么使用状态栏控件
    要在WinForm中使用状态栏控件,您可以按照以下步骤操作: 在Visual Studio中打开您的WinForm项目。 在工具箱...
    99+
    2024-03-12
    WinForm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作