• BackgroundWorker的使用一二(可视化编程,开始后台工作,报告进度,取消后台工作等)


    C# 提供了BackgroundWorker功能非常强大,可以将某项工作放到后台运行,可以让后台报告进度,可以取消后台工作......

    BackgroundWorker的上述功能是通过

    1. 三个主要事件

    DoWork--后台事件。定义完成需要做的后台工作

    ProgressChanged--进度报告事件。定义有进度报告产生时进行要做的工作

    RunWorkerCompleted--后台完成事件。定义后台工作完成后要做的工作

    2 2+x个属性:

    WorkerReportsProgress -- 是否允许报告进度

    WorkerSupportsCancellation -- 是否允许取消

    有些属性是在运行时设置的,不在可视化区,如

    backgroundWorker1.CancellationPending  --执行CancelAsync()会设置

    DoWorkEventArgs.Cancel --设置此属性,通知RunWorkerCompleted已被取消

    3.三个方法

    backgroundWorker1.RunWorkerAsync(); //开始异步工作

    backgroundWorker1.CancelAsync(); //取消异步工作

    //需要注意的是,执行了CancelAsync()后,只是设置了一个CancellationPending标志,后台工作并没有真正挺下来,需要明确的代码退出后台工作

     backgroundWorker1.ReportProgress(int progress, object userstate); //报告进度

      

    4. 可视化开发。VS开发环境中,工具箱提供了可视化的控件。

    简单使用步骤如下

    1)往FORM中拖拽一个BackgroundWorker控件

    2)设置两个属性:

    WorkerReportsProgress -- 是否允许报告进度

    WorkerSupportsCancellation -- 是否允许取消

    3)写三个事件的代码

    DoWork、ProgressChanged、RunWorkerCompleted

    4)报告进度

    某些耗时较长的工作,我们希望在工作中途报告进度,可在DoWork事件中,加入

    backgroundWorker1.ReportProgress(int progress, object userstate)代码报告进度,userState可用于返回其他数据

    5)终止后台工作

    (1)执行CancelAsync(),此代码设置CancellationPending标志

     (2)后台工作中用代码检测CancellationPending标志,检测到CancellationPending后

             处理善后工作

            可选:设置DoWorkEventArgs 参数的Cancel属性为true(e.Cancel=True)

            终止后台工作(return)

    (3)可选:终止后处理

           RunWorkerCompleted事件中检测RunWorkerCompletedEventArgs 参数,是否为终止

       RunWorkerCompletedEventArgs.Cancel=true(第二部的设置值)

      终止后处理代码

    5. 多说无益,上酸菜

    1)FORM设置

    2)上代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Windows.Forms;
    
    namespace VisibleBackgroundWorker
    {
        public partial class Form1 : Form
        {
            int total = 100;
            
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            /// <summary>
            /// 后台作业代码
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e">e.Cancel用于返回终止标志,e.Result用于返回数据,e.Argument为传入的参数</param>
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                List<string> itemList = new List<string>();
                for (int i = 0; i < total; i++)
                {
                    if (backgroundWorker1.CancellationPending)
                    { //如果执行了CancelAsync()                   
                        e.Cancel = true; //设置后台作业取消标志
                        return;
                    }
                    string item = "item " + i.ToString();
                    backgroundWorker1.ReportProgress(i,item);
                    itemList.Add(item);
                    System.Threading.Thread.Sleep(500);
                }
                e.Result = itemList;//返回结果
                
            }
            /// <summary>
            /// 进度报告事件,可用于显示进度、中间结果等
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e">e.ProgressPercentage为进度,e.UserState可定义的回传数据</param>
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            { 
                int p = e.ProgressPercentage;
                string item = e.UserState as string;
                label1.Text = "Progress:" + p.ToString();
                listBox1.Items.Add(item);
                
            }
            /// <summary>
            /// 后台作业完成事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e">e.Cancel为是否被终止的标志</param>
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if(e.Cancelled)
                {//中途终止
                    label1.Text = "Cancel!";
                }
                else
                {//正常结束
                    label1.Text = "Complete!";
                }
                
                listBox2.Items.AddRange((e.Result as List<string>).ToArray());
            }
    
            private void button1_Click(object sender, EventArgs e)
            {   //终止后台作业标志(设置CancellationPending标志)
                backgroundWorker1.CancelAsync();
            }
    
            private void btnGo_Click(object sender, EventArgs e)
            {//开始后台作业
                int arg = 1;//传到后台作业的参数
                backgroundWorker1.RunWorkerAsync(arg);
            }
        }
    }
  • 相关阅读:
    asp.net webform 增加 loading
    DataTable 数据筛选
    c# float 类型传入 sql server float 参数导致结果错误
    Delphi Modal窗体(ModalResult、ShowModal)的介绍、使用方法和注意事项
    通用流水线处理器技术参数
    处理器系列技术参数
    云端一体全栈解决方案
    Camera系列规格参数
    分立器件成品参数
    新能源与智能制造
  • 原文地址:https://www.cnblogs.com/ccjungle/p/7239042.html
Copyright © 2020-2023  润新知