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

一. 多线程常见操作

1. 线程阻塞和任务延续

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

2. 线程取消:

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

(1)线程取消

  cts.Token可以让还没开始分配的线程不再分配
在这里插入图片描述

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

在这里插入图片描述

(3)线程延时自动取消

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

3. 线程返回值

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

(1)线程返回值

在这里插入图片描述

4. 多线程中的异常处理

(1)异常处理

  大家都知道:单线程发生异常,如果需要捕捉,只是try-catch;但是多线程内部发生异常之后,在子线程内部try-catch是无法捕捉到的。但是异常会在Wait中抛出,所以我们可以这样写:
在这里插入图片描述

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

  
  

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#,可以使用Thread类来创建多个线程,并通过调用方法来启动这些线程。如果要在多线程调用带参数有返回值的方法,可以使用委托和异步回调来实现。下面是一个简单的示例代码,演示如何创建和启动多个线程来调用同一个带参数有返回值的方法: ```csharp using System; using System.Threading; class Program { static void Main(string[] args) { // 创建3个线程 Thread t1 = new Thread(new ParameterizedThreadStart(MyMethod)); Thread t2 = new Thread(new ParameterizedThreadStart(MyMethod)); Thread t3 = new Thread(new ParameterizedThreadStart(MyMethod)); // 启动这些线程 t1.Start(1); t2.Start(2); t3.Start(3); // 等待这些线程结束 t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("所有线程已结束"); } static void MyMethod(object param) { int num = (int)param; // 这里是你要执行的方法 Console.WriteLine("线程 {0} 正在执行 MyMethod,参数为 {1}", Thread.CurrentThread.ManagedThreadId, num); // 模拟方法执行 Thread.Sleep(1000); // 返回结果 int result = num * 2; // 调用回调函数返回结果 AsyncCallback callback = new AsyncCallback(MyCallback); callback.BeginInvoke(result, null, null); } static void MyCallback(IAsyncResult result) { int num = (int)result.AsyncState; Console.WriteLine("线程 {0} 的 MyMethod 方法返回了结果 {1}", Thread.CurrentThread.ManagedThreadId, num); } } ``` 在这个示例,我们创建了3个线程,并通过调用Thread.Start()方法来启动它们。这些线程都会调用同一个方法MyMethod(),并传入一个整数参数。在MyMethod()方法,我们模拟了方法的执行过程,并最终返回了一个整数结果。为了返回结果,我们使用了异步回调的方式,将结果传递给MyCallback()方法进行处理。在MyCallback()方法,我们输出了方法执行的结果。 需要注意的是,多线程编程需要注意线程安全性,以免出现竞态条件等问题。在实际开发,需要根据具体情况来选择适合的多线程编程模型和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值