• BackgroundWorker 演练实例


    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Threading;
    using System.Windows.Forms;

    namespace BackgroundWorkerExample
    {    
        public class FibonacciForm : System.Windows.Forms.Form
        {    
            private int numberToCompute = 0;
            private int highestPercentageReached = 0;

            private System.Windows.Forms.NumericUpDown numericUpDown1;
            private System.Windows.Forms.Button startAsyncButton;
            private System.Windows.Forms.Button cancelAsyncButton;
            private System.Windows.Forms.ProgressBar progressBar1;
            private System.Windows.Forms.Label resultLabel;
            private System.ComponentModel.BackgroundWorker backgroundWorker1;

            public FibonacciForm()
            {    
                InitializeComponent();

                InitializeBackgoundWorker();
            }

            // Set up the BackgroundWorker object by 
            
    // attaching event handlers. 
            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(System.Object sender, 
                System.EventArgs e)
            {
                // Reset the text in the result label.
                resultLabel.Text = String.Empty;

                // Disable the UpDown control until 
                
    // the asynchronous operation is done.
                this.numericUpDown1.Enabled = false;

                // Disable the Start button until 
                
    // the asynchronous operation is done.
                this.startAsyncButton.Enabled = false;

                // Enable the Cancel button while 
                
    // the asynchronous operation runs.
                this.cancelAsyncButton.Enabled = true;

                // Get the value from the UpDown control.
                numberToCompute = (int)numericUpDown1.Value;

                // Reset the variable for percentage tracking.
                highestPercentageReached = 0;

                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync(numberToCompute);
            }

            private void cancelAsyncButton_Click(System.Object sender, 
                System.EventArgs e)
            {   
                // Cancel the asynchronous operation.
                this.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.
                this.numericUpDown1.Enabled = true;

                // Enable the Start button.
                startAsyncButton.Enabled = true;

                // Disable the Cancel button.
                cancelAsyncButton.Enabled = false;
            }

            // This event handler updates the progress bar.
            private void backgroundWorker1_ProgressChanged(object sender,
                ProgressChangedEventArgs e)
            {
                this.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.
            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(1616);
                this.numericUpDown1.Maximum = new System.Decimal(new int[] {
                91,
                0,
                0,
                0});
                this.numericUpDown1.Minimum = new System.Decimal(new int[] {
                1,
                0,
                0,
                0});
                this.numericUpDown1.Name = "numericUpDown1";
                this.numericUpDown1.Size = new System.Drawing.Size(8020);
                this.numericUpDown1.TabIndex = 0;
                this.numericUpDown1.Value = new System.Decimal(new int[] {
                1,
                0,
                0,
                0});
                // 
                
    // startAsyncButton
                
    // 
                this.startAsyncButton.Location = new System.Drawing.Point(1672);
                this.startAsyncButton.Name = "startAsyncButton";
                this.startAsyncButton.Size = new System.Drawing.Size(12023);
                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(15372);
                this.cancelAsyncButton.Name = "cancelAsyncButton";
                this.cancelAsyncButton.Size = new System.Drawing.Size(11923);
                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(11216);
                this.resultLabel.Name = "resultLabel";
                this.resultLabel.Size = new System.Drawing.Size(16023);
                this.resultLabel.TabIndex = 3;
                this.resultLabel.Text = "(no result)";
                this.resultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                // 
                
    // progressBar1
                
    // 
                this.progressBar1.Location = new System.Drawing.Point(1848);
                this.progressBar1.Name = "progressBar1";
                this.progressBar1.Size = new System.Drawing.Size(2568);
                this.progressBar1.Step = 2;
                this.progressBar1.TabIndex = 4;
                // 
                
    // backgroundWorker1
                
    // 
                this.backgroundWorker1.WorkerReportsProgress = true;
                this.backgroundWorker1.WorkerSupportsCancellation = true;
                // 
                
    // FibonacciForm
                
    // 
                this.ClientSize = new System.Drawing.Size(292118);
                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 = "Fibonacci Calculator";
                ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
                this.ResumeLayout(false);

            }
            #endregion

            [STAThread]
            static void Main()
            {
                Application.Run(new FibonacciForm());
            }
        }
    }
  • 相关阅读:
    流程控制
    数据类型和运算符
    抽奖
    蓝桥杯 第五届
    python下编译py成pyc和pyo
    Django中提示TemplateDoesNotExist?
    Ubuntu16.04 apache2 wsgi 部署django
    Ubuntu 14.04下Django+MySQL安装部署全过程
    LVM原理及PV、VG、LV、PE、LE关系图
    SQLServer2008-镜像数据库实施手册(双机)SQL-Server2014同样适用
  • 原文地址:https://www.cnblogs.com/itelite/p/2756609.html
Copyright © 2020-2023  润新知