• Winfrom BackgroundWorker


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Reflection;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace BackgroundWorkerExplore
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            #region 异步处理
            //002
            private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
            {
                int max = (int)e.Argument;
                int percent = 0;
                for (int i = 1; i <= max; i++)
                {
                    if (worker.CancellationPending) return i;
    
                    percent = (int)(((double)i / (double)max) * 100);
                    // 摘要:
                    //     引发 System.ComponentModel.BackgroundWorker.ProgressChanged 事件。
                    //   percentProgress:     已完成的后台操作所占的百分比,范围从 0% 到 100%。
                    //   userState:/     传递到 System.ComponentModel.BackgroundWorker.RunWorkerAsync(System.Object) 的状态对象。
                    worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString()));
                    Thread.Sleep(500);
                }
    
                return max;
            }
            //001 首先执行dowork
            private void bgworker_DoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    e.Result = RetrieveData(this.bgworker, e);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }
    
            //003
            private void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                KeyValuePair<int, string> record = (KeyValuePair<int, string>)e.UserState;
                //操作UI
                this.labelResultLeft.Text = string.Format("There are {0} records retrieved!", record.Key);
                this.progressBarLeft.Value = e.ProgressPercentage;
                this.lvLeft.Items.Add(record.Value);
            }
    
            //004所有操作执行完后执行
            private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                try
                {
                    this.labelResultLeft.Text = string.Format("Total records: {0}", e.Result);
                    this.btnStart.Enabled = true;
                    this.btnStop.Enabled = false;
                }
                catch (TargetInvocationException ex)
                {
                    MessageBox.Show(ex.InnerException.GetType().ToString());
                }
            }
            #endregion
    
            private void btnStart_Click(object sender, EventArgs e)
            {
                if (this.bgworker.IsBusy) return;
    
                this.lvLeft.Items.Clear();
                int MaxValue = 10;
                this.bgworker.RunWorkerAsync(MaxValue);
                this.btnStart.Enabled = false;
                this.btnStop.Enabled = true;
            }
    
            private void btnStop_Click(object sender, EventArgs e)
            {
                this.bgworker.CancelAsync();
            }
        }
    }
    

    运行效果:

  • 相关阅读:
    我理解的SNS(一)
    获取某命名规则下一系列表的总条数
    lock后日志干净了
    设计模式学习系列之UML图(创建型模式)
    CLR实用特征异常
    arcgis api for flex 高级主题(一) esri tilemap 四叉树索引研究<转>
    arcgis api for flex 开发入门(三)地图浏览控件的使用<转>
    深入浅出 Javascript API(三)地图配置<转>
    深入浅出 Javascript API(四)绘制 Graphics<转>
    arcgis api for flex 开发入门(二)map 的创建<转>
  • 原文地址:https://www.cnblogs.com/YYkun/p/10785473.html
Copyright © 2020-2023  润新知