zoukankan      html  css  js  c++  java
  • .net通过BackgroundWorker类实现多线程编程

    前面学习了async/await特性来异步处理任务,BackgroundWorker可以在需要另建一个线程,并且后台持续的完成某项工作,而且可以和主线程进行交互通信。

    参考文档:

    https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx

    代码示例:

        class Program
        {
            static void Main(string[] args)
            {
                BackgroundWorkerTest test = new BackgroundWorkerTest();
                test.bgWorkerBeginRun();
                Thread.Sleep(3000);
                Debug.WriteLine("主线程的挂起不影响BackgroundWorker");
                Console.WriteLine("中断后台程序运行请输入:t");
                var str = Console.ReadKey();
                if (str.KeyChar == 't')
                {
                    test.bgWorkerCancel();
                    Console.WriteLine("手动取消BackgroundWorker程序运行");
                }
                Console.WriteLine("结束运行");
                Console.ReadKey();
            }
        }
        class BackgroundWorkerTest
        {
            Stopwatch watch = new Stopwatch();
            BackgroundWorker bgWorker = new BackgroundWorker();
            public BackgroundWorkerTest()
            {
                watch.Start();
                bgWorker.WorkerReportsProgress = true; //能否报告进度更新
                bgWorker.WorkerSupportsCancellation = true;//是否支持异步取消
                //BackgroundWorker对象的处理程序
                bgWorker.DoWork += DoWork_Handler;//调用RunWorkerAsync时发生
                bgWorker.ProgressChanged += ProgressChanged_Handler;//调用ReportProgress(Int32)时发生
                bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;//当后台操作已完成、被取消或引发异常时发生
            }
            public void bgWorkerBeginRun()
            {
                if (!bgWorker.IsBusy)
                    bgWorker.RunWorkerAsync(); //开始执行后台操作
                else
                    Debug.WriteLine("bgWorker正在运行,不能开始!");
            }
            public void bgWorkerCancel()
            {
                bgWorker.CancelAsync(); //请求取消挂起的后台操作
            }
            private void DoWork_Handler(object sender, DoWorkEventArgs args)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
                for (int i = 0; i <= 10; i++)
                {
                    if (worker.CancellationPending) //是否请求取消了后台操作
                    {
                        args.Cancel = true; //获取或设置指示是否应取消事件的值
                        break;
                    }
                    else
                    {
                        worker.ReportProgress(i * 10); //引发ProgressChanged世界
                        Thread.Sleep(1000);
                    }
                }
            }
            private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs args)
            {
                Debug.WriteLine("当前进度" + args.ProgressPercentage + "%");
            }
            private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs args)
            {
                Debug.WriteLine("触发RunWorkerCompleted");
                if (args.Cancelled)
                    Debug.WriteLine("进度条取消");
                else
                    Debug.WriteLine("进度条完成");
            }
        }
    执行代码,如下的结果:
    当前进度0%
    当前进度10%
    当前进度20%
    主线程的挂起不影响BackgroundWorker
    当前进度30%
    当前进度40%
    当前进度50%
    当前进度60%
    当前进度70%
    当前进度80%
    当前进度90%
    当前进度100%
    触发RunWorkerCompleted
    进度条完成
    
    BackgroundWorker类主要用于GUI编程。
  • 相关阅读:
    从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
    算法导论第二章小试牛刀
    python网络编程初级
    python基础的几个小练习题
    LeetCode:114_Flatten Binary Tree to Linked List | 将一棵二叉树变成链表的形式 | Medium
    LeetCode:111_Minimum Depth of Binary Tree | 二叉树的最小深度 | Easy
    LeetCode:110_Balanced Binary Tree | 平衡二叉树 | Easy
    LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
    mysql中json_object函数的使用?
    mysql中json_remove函数的使用?
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575908.html
Copyright © 2011-2022 走看看