多线程浅析原创
金蝶云社区-CM9527
CM9527
1人赞赏了该文章 728次浏览 未经作者许可,禁止转载编辑于2022年02月28日 16:11:23
  • 多线程简介

    多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序

    优点: 1、使用线程可以把占据时间长的程程序中的任务放到后台去处理。

               2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。             3、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等。

    多线程并不会直接加快程序速度,只能增加程序的吞吐率,提高线程的利用效率,不让线程闲置。

  • 实现多线程的两种方式

    1.Thread

    2.Task

    Thead与Task实现多线程的区别

    Thead是通过增加子线程的方式实现多线程;

    Task是通过线程池的方式管理线程,服务器的线程数量是有限的,与CPU的核数有关系,如果线程池里面有空闲线程,Task就会分配空闲线程给它,否则就会处于等待。  

    所有的多线程操作,必定有一个主线程,主线程(ParentThread)与子线程(ChildThread)的生命周期也是相互作用的。 子线程中的IsBackground属性,决定了两类线程生命周期的依赖关系。

    如果ChildThread.IsBackGround=true,ParentThread结束时,ChildThread也会终止; 如果ChildThread.IsBackGround=false,ParentThread必须等ChildThread终止后才会终止。

    Tread是通过设置IsBackGround设置true/false Task默认设置为true

  • 注意事项

    1.使用多线程一定要用线程安全的集合:   比如字典Diction,如果在多线程中使用Diction,会有几率导致添加相同键的报错,因为Diction不是线程安全的,建议使用线程安全的字典ConcurrentDictionary,不然会引起加入重复key的异常

     2.在线程中如果发生异常,可能会引起IIS重启,所以一定要处理异常

  • 异常处理

    不能直接通过在主线程捕获子线程异常 

     image.png

      这种写法是不能捕获到子线程异常 异常的实现机制是严重依赖与线程的栈的。每个线程都有一个栈,线程启动后会在栈上安装一些异常处理帧,并形成一个链表的结构,在异常发生时通过该链表可以进行栈回滚,如果你自己没有安装的话,可能会直接跳到链表尾部,那可能是CRT提供的一个默认处理帧,弹出一个对话框提示某某地址内存错误等,然后确认调试,取消关闭。 所以说,线程之间是不可能发生异常处理的交换关系的。

     1.在子线程中直接处理异常

     image.png

   2.2.Task方式处理异常,使用ContinueWith捕获异常,OnlyOnFaulted设置只有异常时才处理



赞 1