本文共 5556 字,大约阅读时间需要 18 分钟。
using System;using System.Collections;using System.ComponentModel;using System.Threading;using System.Windows.Forms; public class FibonacciForm : Form{private int numberToCompute = 0;private int highestPercentageReached = 0;private NumericUpDown numericUpDown1;private Button startAsyncButton;private Button cancelAsyncButton;private ProgressBar progressBar1;private Label resultLabel;private BackgroundWorker backgroundWorker1; public FibonacciForm(){ InitializeComponent(); InitializeBackgroundWorker();}private void InitializeBackgroundWorker(){ 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){ resultLabel.Text = string.Empty; numericUpDown1.Enabled = false; startAsyncButton.Enabled = false; cancelAsyncButton.Enabled = true; numberToCompute = (int)numericUpDown1.Value; highestPercentageReached = 0; backgroundWorker1.RunWorkerAsync(numberToCompute);}private void cancelAsyncButton_Click(object sender, EventArgs e){ backgroundWorker1.CancelAsync(); cancelAsyncButton.Enabled = false;}private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){ BackgroundWorker worker = sender as BackgroundWorker; e.Result = ComputeFibonacci((int)e.Argument, worker, e);}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){ if (e.Error != null) { MessageBox.Show(e.Error.Message); } else if (e.Cancelled) { resultLabel.Text = "Canceled"; } else { resultLabel.Text = e.Result.ToString(); } numericUpDown1.Enabled = true; startAsyncButton.Enabled = true; cancelAsyncButton.Enabled = false;}private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){ progressBar1.Value = e.ProgressPercentage;}long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e){ if ((n < 0) || (n > 91)) { throw new ArgumentException("value must be >= 0 and <= 91", "n"); } long result = 0; if (worker.CancellationPending) { e.Cancel = true; } else { if (n < 2) { result = 1; } else { result = ComputeFibonacci(n - 1, worker, e) + ComputeFibonacci(n - 2, worker, e); } int percentComplete = (int)((float)n / (float)numberToCompute * 100); if (percentComplete > highestPercentageReached) { highestPercentageReached = percentComplete; worker.ReportProgress(percentComplete); } } return result;}private void InitializeComponent(){ numericUpDown1 = new NumericUpDown(); startAsyncButton = new Button(); cancelAsyncButton = new Button(); resultLabel = new Label(); progressBar1 = new ProgressBar(); backgroundWorker1 = new BackgroundWorker(); numericUpDown1.Location = new Point(16, 16); numericUpDown1.Maximum = new Decimal(new int[] { 91, 0, 0, 0 }); numericUpDown1.Minimum = new Decimal(new int[] { 1, 0, 0, 0 }); numericUpDown1.Name = "numericUpDown1"; numericUpDown1.Size = new Size(80, 20); numericUpDown1.TabIndex = 0; numericUpDown1.Value = new Decimal(new int[] { 1, 0, 0, 0 }); startAsyncButton.Location = new Point(16, 72); startAsyncButton.Name = "startAsyncButton"; startAsyncButton.Size = new Size(120, 23); startAsyncButton.TabIndex = 1; startAsyncButton.Text = "Start Async"; startAsyncButton.Click += new EventHandler(startAsyncButton_Click); cancelAsyncButton.Enabled = false; cancelAsyncButton.Location = new Point(153, 72); cancelAsyncButton.Name = "cancelAsyncButton"; cancelAsyncButton.Size = new Size(119, 23); cancelAsyncButton.TabIndex = 2; cancelAsyncButton.Text = "Cancel Async"; cancelAsyncButton.Click += new EventHandler(cancelAsyncButton_Click); resultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; resultLabel.Location = new Point(112, 16); resultLabel.Name = "resultLabel"; resultLabel.Size = new Size(160, 23); resultLabel.TabIndex = 3; resultLabel.Text = "(no result)"; resultLabel.TextAlign = ContentAlignment.MiddleCenter; progressBar1.Location = new Point(18, 48); progressBar1.Name = "progressBar1"; progressBar1.Size = new Size(256, 8); progressBar1.Step = 2; progressBar1.TabIndex = 4; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; this.ClientSize = new Size(292, 118); this.Controls.Add(progressBar1); this.Controls.Add(resultLabel); this.Controls.Add(cancelAsyncButton); this.Controls.Add(startAsyncButton); this.Controls.Add(numericUpDown1); this.Name = "FibonacciForm"; this.Text = "Fibonacci Calculator";} }
转载地址:http://hytiz.baihongyu.com/