• 衔接UI线程和管理后台工作线程的类(多线程、异步调用)


    一、引言
         在编写Windows form时,如果直接在UI线程要运行一个费时方法的话(如从数据库查询大量数据时),会引起程序“假死”,从而导致用户不满。这个时候就需要通过多线程技术来解决,提高界面交互性能,方便用户使用。
    一般通过三种方式解决:
    1.通过System.Threading.Thread类,创建新的线程,Thread.Start运行费时方法。
    2.通过System.Threading.ThreadPool类,将费时任务提交到线程池中,等待运行。
    以上两种方法,基本思路是在UI界面中控制线程的启动和中止,在线程中回调用UI界面方法,更新界面。在线程中回调UI界面方法时,特别是涉及更新控件属性时,如果不注意,存在很大的隐患。这两种办法,编码和控制结构较为复杂,需要启动和管理额外的线程占用资源。
    3.通过异步委托调用,将该方法排队到系统线程池的线程中运行,而在费时方法中也通过Control.BeginInvoke异步回调,达到"启动后不管"的目的。
    这种方法,编码简单,程序结构较为清晰,充分利用.NET框架的异步委托功能,但要对异步调用知识较熟悉。
    相关知识点参见
         现利用.NET异步委托调用功能,编写Task抽象类,以方便管理后台工作线程,衔接后台线程与UI线程的联系。该抽象类提供了调用和管理的框架,没有方法的实现细节,通过继承类、重写方法,可以实现想要的功能。主要功能如下:
    1.利用异步委托调用,实际多线程,不需要单独后台线程。
    2.通过委托、事件驱动,实际后台与前台UI线程的联系,实现事件广播。
    3.支持正常取消后台工作方法(费时方法)运行,也可以强制中止线程。
    4.能够捕获取消、强制中止和方法出错三种情况,并突发相关事件,以便进行释放资源等操作。
    5.通过异步调用,在工作方法中安全调用涉及UI控件的方法。
    6.自行管理工作进程状态,提供状态变化事件。
    7.只要工作方法调用签名,符合定义的TaskDelegate委托接口,可通过StartTask(TaskDelegate worker ,params object[] args )方便调用。在实际使用时,可在继承类中定义多个相同调用接口的方法,避免重复编码,较为方便。

    给大家作个参考,而大牛呢,多点指正。当是扔个砖头,想砸块玉吧。


    二、代码

      1using System;
      2using System.Windows.Forms;
      3
      4namespace Net66.AsynchThread
      5{
      6    /// <summary>
      7    /// 任务工作状态
      8    /// </summary>

      9    public enum TaskStatus 
     10     
     37
     38    /// <summary>
     39    /// 任务状态消息
     40    /// </summary>

     41    public class TaskEventArgs : EventArgs 
     42         
    137
    138    /// <summary>
    139    /// 任务的工作方法(Work)的委托接口
    140    /// 传入值:对象数组(object[])
    141    /// 返回值:对象(object)
    142    /// </summary>

    143    public delegate object TaskDelegate( params object[] args ); 
    144
    145    /// <summary>
    146    /// 任务事件的委托接口
    147    /// </summary>

    148    public delegate void TaskEventHandler( object sender, TaskEventArgs e ); 
    149
    150    abstract public class Task
    151    {   
    152        内部属性
    178
    179        事件
    201
    202        属性
    267
    268        触发事件
    358
    359        工作进程管理
    497
    498        工作方法的基础
    520    }

    521}

    522
    523使用Task类
    636



    三、示例
    1.启动时的UI界面


    2.后台工作方法(费用方法)运行后,任务状态为Running


    3.强制中止工作方法,运行任务状态Aborted


    4.工作方法突发错误时,任务状态ThrowErrorStoped


    5.工作方法正常结束或正常取消而结束时,任务状态Stopped


    示例代码下载

  • 相关阅读:
    $Noip2018/Luogu5022$ 旅行
    $Noip2018/Luogu5020$ 货币系统 $dp$
    $Noip2018/Luogu5021$ 赛道修建 二分+树形
    $Noip2018/Luogu5019/Luogu1969$ 铺设道路
    $Poj1220/AcWing124 Number Base Convertion$ 进制转换+高精除
    $Poj1050 To the Max$
    $Poj1723/AcWing123 Soldiers$ 排序
    luogu质数距离
    模板线性筛
    CERC2016 bfs 最大生瓶颈边 lca
  • 原文地址:https://www.cnblogs.com/net66/p/206132.html
Copyright © 2020-2023  润新知