C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)

C#多线程进阶(一)

  • 一. 多线程常见操作
    • 1. 线程阻塞和任务延续
          •   (1)主线程等待一个或多个子线程执行完后再执行(或者)等待多个子线程中任何一个任务完成再执行
          •   (2)某个子线程等待一个或多个子线程执行完后再执行(或者)等待多个子线程中任何一个任务完成再执行
          •   (3)线程嵌套(父子关系):在复杂的多线程编程中,需要更清晰的表现出线程之间的关系时使用。
          •   (4)开启长耗时任务的线程
    • 2. 线程取消:
          • (1)线程取消
          • (2)线程取消并自动清理
          • (3)线程延时自动取消
    • 3. 线程返回值
          • (1)线程返回值
    • 4. 多线程中的异常处理
          • (1)异常处理

一. 多线程常见操作

1. 线程阻塞和任务延续

  (1)主线程等待一个或多个子线程执行完后再执行(或者)等待多个子线程中任何一个任务完成再执行

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第1张图片

  (2)某个子线程等待一个或多个子线程执行完后再执行(或者)等待多个子线程中任何一个任务完成再执行

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第2张图片

  (3)线程嵌套(父子关系):在复杂的多线程编程中,需要更清晰的表现出线程之间的关系时使用。

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第3张图片

  (4)开启长耗时任务的线程

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第4张图片

2. 线程取消:

  在实际的多线程场景中,有可能需要把某个线程给取消了
   注意: 线程取消并不是能够马上取消的,它是通过判断是否让分配的线程去执行业务逻辑,达到线程取消的目的;

(1)线程取消

  cts.Token可以让还没开始分配的线程不再分配
C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第5张图片

(2)线程取消并自动清理

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第6张图片

(3)线程延时自动取消

  不需要手动 cts.Cancel();
在这里插入图片描述

3. 线程返回值

  多数情况下,我们希望Task执行完毕后,得到一个结果供后续使用

(1)线程返回值

C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第7张图片

4. 多线程中的异常处理

(1)异常处理

  大家都知道:单线程发生异常,如果需要捕捉,只是try-catch;但是多线程内部发生异常之后,在子线程内部try-catch是无法捕捉到的。但是异常会在Wait中抛出,所以我们可以这样写:
C#多线程进阶一(线程阻塞和任务延续,线程取消,线程返回值,多线程中的异常处理)_第8张图片

  实际的场景中,开发者是绝不能让子线程内部发生异常的;如果子线程有一个发生异常之后,应该把整个业务流程停下来;

  
  

你可能感兴趣的:(C#高级进阶,多线程,thread,并发编程)