C# 4.0 等待线程结束

在C#中,如果你正在使用多线程编程,并且想要等待一个或多个线程完成它们的工作再继续执行,有几种方式可以实现。从C# 4.0开始,虽然直接用于等待线程结束的特性(如Thread.Join())在之前的版本中也已经存在,但C# 4.0引入了Task类,它提供了更现代、更灵活的方式来处理异步操作和并行编程。

使用Thread.Join()

虽然这不是C# 4.0引入的,但Thread.Join()方法是最直接的方式来等待一个线程完成。你只需调用你想要等待的线程的Join()方法即可。这个方法会阻塞当前线程,直到被调用的线程执行完毕。

复制代码
Thread thread = new Thread(new ThreadStart(DoWork));  
thread.Start();  
  
// 等待线程结束  
thread.Join();  
  
Console.WriteLine("线程已结束");

使用 Task

从C# 4.0开始,Task类被引入以支持更高级的异步编程模式。Task提供了一种更简洁的方式来表示异步操作,并且可以与await关键字(在C# 5.0及更高版本中引入)一起使用,以实现非阻塞的等待。

创建并等待Task
复制代码
Task task = Task.Run(() => DoWork());  
  
// 等待Task完成  
task.Wait();  
  
Console.WriteLine("Task已结束");

注意:Task.Wait()和Thread.Join()都会阻塞调用它们的线程,直到等待的操作完成。

使用await(C# 5.0及更高版本)

如果你使用的是C# 5.0或更高版本,并且你的方法是一个async方法,你可以使用await关键字来非阻塞地等待Task完成。

复制代码
async Task Main(string[] args)  
{  
    Task task = Task.Run(() => DoWork());  
  
    // 等待Task完成,但不会阻塞当前线程  
    await task;  
  
    Console.WriteLine("Task已结束");  
}  
  
void DoWork()  
{  
    // 模拟一些工作  
    Thread.Sleep(1000);  
}

在这个例子中,Main方法被标记为async,这允许我们在其中使用await。调用await task;时,Main方法的执行会在当前位置暂停,直到task完成,但此时不会阻塞调用Main方法的线程(在控制台应用程序中,这通常是主线程)。await使得异步代码看起来和写起来都像同步代码一样简单。

总结

对于C# 4.0,如果你需要等待线程结束,Thread.Join()是一个直接的选择。然而,如果你有机会使用更高版本的C#,那么使用Task和await将提供更灵活、更强大的异步编程能力。

相关推荐
SelectDB技术团队7 分钟前
从实时入库到实时可用:Apache Doris 5.0 增量计算场景与实践
数据库·人工智能·开源·agent·实时数仓·apache doris·增量计算
Wang's Blog15 分钟前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友
Brilliantwxx16 分钟前
【STM32】 独立看门狗 IWDG 深度详解:从硬件结构到工程实战
数据库·stm32·单片机·嵌入式硬件·mongodb
运维小斌25 分钟前
麒麟 V10 部署 OceanBase:故障速查与验收清单
linux·数据库·oceanbase·麒麟
LMT流氓兔37 分钟前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain
code2cat1 小时前
Java高级篇之JDBC:连接数据库,完成查询、更新与事务
java·开发语言·数据库
*长铗归来*1 小时前
MySQL新学知识(三)MySQL 事件(EVENT)
数据库·mysql
Warolitbos1 小时前
【数据库】SQL进阶15题,窗口函数/索引/事务一页速查
数据库·sql·学习·mysql·面试
BioRunYiXue1 小时前
使用docker分析高通量测序数据
java·数据库·人工智能·spring cloud·docker·tomcat·html
卓豪终端管理1 小时前
300 台终端补丁推送完成 ≠ 漏洞关闭:补丁稽核闭环的状态机与工程落点
网络·数据库·php