当前位置 : 主页 > 手机开发 > ROM >

Winfrom BackgroundWorker

来源:互联网 收集:自由互联 发布时间:2021-06-10
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() { Init
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();
        }
    }
}

运行效果:

分享图片

上一篇:求最长回文串
下一篇:Buffer基本操作
网友评论