• BackgroundWorker组件学习


    今天看到别人的博客中提到了BackgroundWorker组件。在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看。今天凑巧看到了一个关于BackgroundWorker组件的例子,对原代码中存在的问题进行了一下修改。自己也学习了一下。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace BackGroundWorkerDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                backgroundWorker1.WorkerReportsProgress = true;//报告进度
                backgroundWorker1.WorkerSupportsCancellation = true;//支持取消异步进程
                progressBar1.Maximum = 10000;//进度条的最大值设置要与其真实要显示的值相对应。
                backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
                backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
                backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                backgroundWorker1.CancelAsync();
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.progressBar1.Value = e.ProgressPercentage;
                this.label1.Text = e.UserState.ToString();
                //由于lable的值更新的特别快,此时只是对text属性赋值的话,label也并不能及时ReDraw显示。所以要强制对控件进行刷新
                //可以用label继承的Control的Update方法,也可以用Refresh(),二者均可以强制重绘控件,进行刷新
                this.label1.Update();
                //this.label1.Refresh();
            }
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show(@"运算完成");
            }
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                work(this.backgroundWorker1);
            }
            private bool work(BackgroundWorker bk)
            {
                int tatle = 10000;
    
                for (int i = 0; i < tatle; i++)
                {
                    if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
                    {
                        bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
                        return false;
                    }
    
                    //处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,
                    //与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
                    bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
                }
                return true;
            }
        }
    }

    最后的效果是:

          

    滚动条的效果还蛮拉风的~

  • 相关阅读:
    树链剖分
    NOI2015 软件包管理器(树链剖分+线段树)
    9.11NOIP模拟题
    9.10NOIP模拟题
    bzoj1121[POI2008]激光发射器SZK(结论)
    9.9 NOIP模拟题
    树形dp
    P1272 重建道路(树形dp)
    Codeforces Round #419 (Div. 2)
    9.2NOIP模拟题
  • 原文地址:https://www.cnblogs.com/hanpanpan/p/3360295.html
Copyright © 2020-2023  润新知