zoukankan      html  css  js  c++  java
  • BackgroundWorker 之:在后台运行操作

    如果有一个需要很长时间才能完成的操作,而且不希望用户界面中出现延迟,则可以使用 BackgroundWorker 类来在另一个线程上运行该操作。

    下面的代码示例演示如何在后台运行耗时的操作。该窗体具有“开始”“取消”按钮。单击“开始”按钮可运行异步操作。单击“取消”按钮可停止正在运行的异步操作。每个操作的结果均在 MessageBox 中显示。

    Visual Studio 中对此任务提供了广泛的支持。

    示例:
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Threading;
    using System.Windows.Forms;

    namespace BackgroundWorkerExample
    {
        public class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                // Do not access the form's BackgroundWorker reference directly.
                // Instead, use the reference provided by the sender parameter.
                BackgroundWorker bw = sender as BackgroundWorker;

                // Extract the argument.
                int arg = (int)e.Argument;

                // Start the time-consuming operation.
                e.Result = TimeConsumingOperation(bw, arg);

                // If the operation was canceled by the user,
                // set the DoWorkEventArgs.Cancel property to true.
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                }
            }

            // This event handler demonstrates how to interpret
            // the outcome of the asynchronous operation implemented
            // in the DoWork event handler.
            private void backgroundWorker1_RunWorkerCompleted(
                object sender,
                RunWorkerCompletedEventArgs e)
            {  
                if (e.Cancelled)
                {
                    // The user canceled the operation.
                    MessageBox.Show("Operation was canceled");
                }
                else if (e.Error != null)
                {
                    // There was an error during the operation.
                    string msg = String.Format("An error occurred: {0}", e.Error.Message);
                    MessageBox.Show(msg);
                }
                else
                {
                    // The operation completed normally.
                    string msg = String.Format("Result = {0}", e.Result);
                    MessageBox.Show(msg);
                }
            }

            // This method models an operation that may take a long time
            // to run. It can be cancelled, it can raise an exception,
            // or it can exit normally and return a result. These outcomes
            // are chosen randomly.
            private int TimeConsumingOperation(
                BackgroundWorker bw,
                int sleepPeriod )
            {
                int result = 0;

                Random rand = new Random();

                while (!bw.CancellationPending)
                {
                    bool exit = false;

                    switch (rand.Next(3))
                    {
                        // Raise an exception.
                        case 0:
                        {
                            throw new Exception("An error condition occurred.");
                            break;
                        }

                        // Sleep for the number of milliseconds
                        // specified by the sleepPeriod parameter.
                        case 1:
                        {
                            Thread.Sleep(sleepPeriod);
                            break;
                        }

                        // Exit and return normally.
                        case 2:
                        {
                            result = 23;
                            exit = true;
                            break;
                        }

                        default:
                        {
                            break;
                        }
                    }

                    if( exit )
                    {
                        break;
                    }
                }

                return result;
            }

            private void startBtn_Click(object sender, EventArgs e)
            {
                this.backgroundWorker1.RunWorkerAsync(2000);
            }

            private void cancelBtn_Click(object sender, EventArgs e)
            {
                this.backgroundWorker1.CancelAsync();
            }

            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            #region Windows Form Designer generated code

            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
                this.startBtn = new System.Windows.Forms.Button();
                this.cancelBtn = new System.Windows.Forms.Button();
                this.SuspendLayout();
                //
                // backgroundWorker1
                //
                this.backgroundWorker1.WorkerSupportsCancellation = true;
                this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
                this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
                //
                // startBtn
                //
                this.startBtn.Location = new System.Drawing.Point(12, 12);
                this.startBtn.Name = "startBtn";
                this.startBtn.Size = new System.Drawing.Size(75, 23);
                this.startBtn.TabIndex = 0;
                this.startBtn.Text = "Start";
                this.startBtn.Click += new System.EventHandler(this.startBtn_Click);
                //
                // cancelBtn
                //
                this.cancelBtn.Location = new System.Drawing.Point(94, 11);
                this.cancelBtn.Name = "cancelBtn";
                this.cancelBtn.Size = new System.Drawing.Size(75, 23);
                this.cancelBtn.TabIndex = 1;
                this.cancelBtn.Text = "Cancel";
                this.cancelBtn.Click += new System.EventHandler(this.cancelBtn_Click);
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(183, 49);
                this.Controls.Add(this.cancelBtn);
                this.Controls.Add(this.startBtn);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);

            }

            #endregion

            private System.ComponentModel.BackgroundWorker backgroundWorker1;
            private System.Windows.Forms.Button startBtn;
            private System.Windows.Forms.Button cancelBtn;
        }

        public class Program
        {
            private Program()
            {
            }

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.Run(new Form1());
            }
        }
    }


  • 相关阅读:
    linux 常用命令(个人记录)
    jmeter 5.0版本更新说明(个人做个记录)
    Netdata---Linux系统性能实时监控平台部署记录
    MySQL Yum存储库 安装、升级、集群
    linux 各项配置汇总
    构建Maven项目自动下载jar包
    计算服务器的pv量算法
    性能计算公式
    jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
    结构模式
  • 原文地址:https://www.cnblogs.com/fang8206/p/2283182.html
Copyright © 2011-2022 走看看