backgroundWorker异步操作二—进度事件

 

backgroundWorker异步操作二进度事件

using System;

using System.ComponentModel;

using System.Windows.Forms;

 

namespace BackgroundWorkerExample

{

    public class FibonacciForm : Form

    {

        private BackgroundWorker backgroundWorker1;

        private Button cancelAsyncButton;

        private int highestPercentageReached = 0;

        private int numberToCompute = 0;

 

        private NumericUpDown numericUpDown1;

        private ProgressBar progressBar1;

        private Label resultLabel;

        private Button startAsyncButton;

 

        public FibonacciForm()

        {

            InitializeComponent();

            InitializeBackgoundWorker();

        }

 

        // 初始化backgroundWorker1组件,如果是从工具箱托该组件到面板,点击生成事件,此处可以省略。.

        private void InitializeBackgoundWorker()

        {

            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

            backgroundWorker1.RunWorkerCompleted +=

                new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

        }

 

        private void startAsyncButton_Click(Object sender, EventArgs e)

        {

            // Reset the text in the result label.

            resultLabel.Text = String.Empty;

 

            // Disable the UpDown control until

            // the asynchronous operation is done.

            numericUpDown1.Enabled = false;

 

            // Disable the Start button until

            // the asynchronous operation is done.

            startAsyncButton.Enabled = false;

 

            // Enable the Cancel button while

            // the asynchronous operation runs.

            cancelAsyncButton.Enabled = true;

 

            // DoWork事件里面处理程序ComputeFibonacci的参

            numberToCompute = (int) numericUpDown1.Value;

 

            // Reset the variable for percentage tracking.

            highestPercentageReached = 0;

 

            // Start the asynchronous operation. (int) e.Argument可以获得此参数

            backgroundWorker1.RunWorkerAsync(numberToCompute);

        }

 

        private void cancelAsyncButton_Click(Object sender,

                                             EventArgs e)

        {

            // Cancel the asynchronous operation.

            backgroundWorker1.CancelAsync();

 

            // Disable the Cancel button.

            cancelAsyncButton.Enabled = false;

        }

 

        // This event handler is where the actual,

        // potentially time-consuming work is done.

        private void backgroundWorker1_DoWork(object sender,

                                              DoWorkEventArgs e)

        {

            // Get the BackgroundWorker that raised this event.

            BackgroundWorker worker = sender as BackgroundWorker;

 

            // Assign the result of the computation

            // to the Result property of the DoWorkEventArgs

            // object. This is will be available to the

            // RunWorkerCompleted eventhandler.

            e.Result = ComputeFibonacci((int) e.Argument, worker, e);

        }

 

        // This event handler deals with the results of the

        // background operation.

        private void backgroundWorker1_RunWorkerCompleted(

            object sender, RunWorkerCompletedEventArgs e)

        {

            // First, handle the case where an exception was thrown.

            if (e.Error != null)

            {

                MessageBox.Show(e.Error.Message);

            }

            else if (e.Cancelled)

            {

                // Next, handle the case where the user canceled

                // the operation.

                // Note that due to a race condition in

                // the DoWork event handler, the Cancelled

                // flag may not have been set, even though

                // CancelAsync was called.

                resultLabel.Text = "Canceled";

            }

            else

            {

                // Finally, handle the case where the operation

                // succeeded.

                resultLabel.Text = e.Result.ToString();

            }

 

            // Enable the UpDown control.

            numericUpDown1.Enabled = true;

 

            // Enable the Start button.

            startAsyncButton.Enabled = true;

 

            // Disable the Cancel button.

            cancelAsyncButton.Enabled = false;

        }

 

        // This event handler updates the progress bar.获取进度,绑定到progressBar1

        private void backgroundWorker1_ProgressChanged(object sender,

                                                       ProgressChangedEventArgs e)

        {

            progressBar1.Value = e.ProgressPercentage;

        }

 

        // This is the method that does the actual work. For this

        // example, it computes a Fibonacci number and

        // reports progress as it does its work.

        private long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e)

        {

            // The parameter n must be >= 0 and <= 91.

            // Fib(n), with n > 91, overflows a long.

            if ((n < 0) || (n > 91))

            {

                throw new ArgumentException(

                    "value must be >= 0 and <= 91", "n");

            }

 

            long result = 0;

 

            // Abort the operation if the user has canceled.

            // Note that a call to CancelAsync may have set

            // CancellationPending to true just after the

            // last invocation of this method exits, so this

            // code will not have the opportunity to set the

            // DoWorkEventArgs.Cancel flag to true. This means

            // that RunWorkerCompletedEventArgs.Cancelled will

            // not be set to true in your RunWorkerCompleted

            // event handler. This is a race condition.

            if (worker.CancellationPending)

            {

                e.Cancel = true;

            }

            else

            {

                if (n < 2)

                {

                    result = 1;

                }

                else

                {

                    result = ComputeFibonacci(n - 1, worker, e) +

                             ComputeFibonacci(n - 2, worker, e);

                }

 

                // Report progress as a percentage of the total task.

                int percentComplete =

                    (int) ((float) n/(float) numberToCompute*100);

                if (percentComplete > highestPercentageReached)

                {

                    highestPercentageReached = percentComplete;

                    worker.ReportProgress(percentComplete);

                }

            }

            return result;

        }

 

        #region Windows Form Designer generated code

 

        private void InitializeComponent()

        {

            this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();

            this.startAsyncButton = new System.Windows.Forms.Button();

            this.cancelAsyncButton = new System.Windows.Forms.Button();

            this.resultLabel = new System.Windows.Forms.Label();

            this.progressBar1 = new System.Windows.Forms.ProgressBar();

            this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();

            ((System.ComponentModel.ISupportInitialize) (this.numericUpDown1)).BeginInit();

            this.SuspendLayout();

            //

            // numericUpDown1

            //

            this.numericUpDown1.Location = new System.Drawing.Point(16, 16);

            this.numericUpDown1.Maximum = new decimal(new int[]

                                                          {

                                                              91,

                                                              0,

                                                              0,

                                                              0

                                                          });

            this.numericUpDown1.Minimum = new decimal(new int[]

                                                          {

                                                              1,

                                                              0,

                                                              0,

                                                              0

                                                          });

            this.numericUpDown1.Name = "numericUpDown1";

            this.numericUpDown1.Size = new System.Drawing.Size(80, 21);

            this.numericUpDown1.TabIndex = 0;

            this.numericUpDown1.Value = new decimal(new int[]

                                                        {

                                                            1,

                                                            0,

                                                            0,

                                                            0

                                                        });

            //

            // startAsyncButton

            //

            this.startAsyncButton.Location = new System.Drawing.Point(16, 72);

            this.startAsyncButton.Name = "startAsyncButton";

            this.startAsyncButton.Size = new System.Drawing.Size(120, 23);

            this.startAsyncButton.TabIndex = 1;

            this.startAsyncButton.Text = "Start Async";

            this.startAsyncButton.Click += new System.EventHandler(this.startAsyncButton_Click);

            //

            // cancelAsyncButton

            //

            this.cancelAsyncButton.Enabled = false;

            this.cancelAsyncButton.Location = new System.Drawing.Point(153, 72);

            this.cancelAsyncButton.Name = "cancelAsyncButton";

            this.cancelAsyncButton.Size = new System.Drawing.Size(119, 23);

            this.cancelAsyncButton.TabIndex = 2;

            this.cancelAsyncButton.Text = "Cancel Async";

            this.cancelAsyncButton.Click += new System.EventHandler(this.cancelAsyncButton_Click);

            //

            // resultLabel

            //

            this.resultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;

            this.resultLabel.Location = new System.Drawing.Point(112, 16);

            this.resultLabel.Name = "resultLabel";

            this.resultLabel.Size = new System.Drawing.Size(160, 23);

            this.resultLabel.TabIndex = 3;

            this.resultLabel.Text = "(no result)";

            this.resultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

            //

            // progressBar1

            //

            this.progressBar1.Location = new System.Drawing.Point(18, 48);

            this.progressBar1.Name = "progressBar1";

            this.progressBar1.Size = new System.Drawing.Size(256, 8);

            this.progressBar1.Step = 2;

            this.progressBar1.TabIndex = 4;

            //

            // backgroundWorker1

            //

            this.backgroundWorker1.WorkerReportsProgress = true;

            this.backgroundWorker1.WorkerSupportsCancellation = true;

            //

            // FibonacciForm

            //

            this.ClientSize = new System.Drawing.Size(292, 118);

            this.Controls.Add(this.progressBar1);

            this.Controls.Add(this.resultLabel);

            this.Controls.Add(this.cancelAsyncButton);

            this.Controls.Add(this.startAsyncButton);

            this.Controls.Add(this.numericUpDown1);

            this.Name = "FibonacciForm";

            this.Text = "7";

            ((System.ComponentModel.ISupportInitialize) (this.numericUpDown1)).EndInit();

            this.ResumeLayout(false);

        }

 

        #endregion

 

        //[STAThread]

        //static void Main()

        //{

        //    Application.Run(new FibonacciForm());

        //}

    }

}

转载于:https://www.cnblogs.com/blue-th/archive/2008/09/26/1299539.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值