文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

winform多线程组件BackgroundWorker怎么使用

2023-06-30 13:33

关注

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

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

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

常用方法

常用属性

常用事件

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

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

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

使用backgroundWorker步骤

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怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯