多线程学习笔记(二) BackgroundWorker 和 ProgressChanged

时间:2019-09-17
本文章向大家介绍多线程学习笔记(二) BackgroundWorker 和 ProgressChanged,主要包括多线程学习笔记(二) BackgroundWorker 和 ProgressChanged使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

BackgroundWorker会在主线程之外,另开一个后台线程,

我们可以把一些处理放在后台线程中处理,完成之后,后台线程会把结果传递给主线程,同时结束自己。

如果要显示进度,比如我们希望走马灯式更新label,就要把 bw.WorkerReportsProgress = true;

        private void button3_Click(object sender, EventArgs e)
        {
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.WorkerReportsProgress = true;
                bw.ProgressChanged += bw_ProgressChanged;
                bw.RunWorkerCompleted += bw_RunWorkerCompleted;
                bw.DoWork += bw_DoWork;

                //允许用户指定显示数据的范围呢!所以需要把100作为参数传递给计算过程
                bw.RunWorkerAsync(100); 
            }

        }
        //这时返回了主线程,所以可以直接使用UI控件了
        void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //修改进度条的显示。
            //this.progressBarSum.Value = e.ProgressPercentage;

            //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
            //这是一个 object 类型的对象,您可以通过它传递任何类型。
            //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
            string message = e.UserState.ToString();
            label1.Text = message;
        }
        //e.Argument=bw.RunWorkerAsync("Hello World")的参数
        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("bw_DoWork");
            BackgroundWorker bgWorker = sender as BackgroundWorker;
            //这里的操作是在另一个线程上完成的,不应该操作UI
            //在这里执行耗时的运算。

            int endNumber = 0;
            if (e.Argument != null)
            {
                endNumber = (int)e.Argument;
            }

            for (int i = 0; i <= endNumber; i++)
            {
                bgWorker.ReportProgress(i, "current num:" + i.ToString());
                Thread.Sleep(50); //为了方便演示
            }
            
        }
        //这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("bw_RunWorkerCompleted");
            if (e.Error == null)
                lblMsg.Text = "正常结束";
            else
                lblMsg.Text = "异常结束"+ e.Error.Message;
        }

参考: https://www.cnblogs.com/sparkdev/p/5906272.html

原文地址:https://www.cnblogs.com/zitjubiz/p/11532501.html