• C# BackgroundWorker组件学习


    C# BackgroundWorker组件学习

     C# BackgroundWorker组件学习

           一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.     

     

            BackgroundWorker类允许您在单独的专用线程上运行操作。  耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。

      如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。 

     

            若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。  可以通过编程方式创建BackgroundWorker

      也可以将它从“工具箱”“组件”选项卡中拖到窗体上。  如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗

      口中(MSDN)。

     

      属性:

       IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操作。

       WorkerReportsProgress:获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。

       WorkerSupportsCancellation:获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。

       事件:

       DoWork:调用 RunWorkerAsync 时发生。

       ProgressChanged:调用 ReportProgress 时发生。

       RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。

       实例:

       窗体设计如下图:

      

       代码实现:

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                backgroundWorker1.WorkerReportsProgress = true;
                backgroundWorker1.WorkerSupportsCancellation = true;
            }
     
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
     
                for (int i = 1; i <= 12; i++)
                {
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        break;
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(500);
                        worker.ReportProgress(i * 10);
                    }
                }
            }
     
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
            }
     
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Cancelled == true)
                {
                    lbResult.Text = "Canceled!";
                }
                else if (e.Error != null)
                {
                    lbResult.Text = "Error: " + e.Error.Message;
                }
                else
                {
                    lbResult.Text = "Done!";
                }
            }
     
            private void btnStartAsync_Click(object sender, EventArgs e)
            {
                if (backgroundWorker1.IsBusy != true)
                {
                    backgroundWorker1.RunWorkerAsync();
                }
            }
     
            private void btnCancelAsync_Click(object sender, EventArgs e)
            {
                if (backgroundWorker1.WorkerSupportsCancellation == true)
                {
                    backgroundWorker1.CancelAsync();
                }
            }
        }
    }

       运行结果:

     
     
    分类: C#学习
    标签: C#学习
  • 相关阅读:
    什么是https?
    简单的理解依赖注入
    Java多线程学习笔记——信号量的使用
    算法学习之一,排序算法
    MySQL中自己不太常用的命令
    如何判断链表相交
    windows&cmd常用命令&快捷键
    ubuntu桌面安装常用软件&及常见问题
    redis在windows上安装+RedisDesktopManager
    windows php5.4,5.6,7.X添加redis扩展
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3360289.html
Copyright © 2020-2023  润新知