1、Action 委托,有N个入参,无返回值 Action<t1,t2,t3...> act = new Action<t1,t2,t3...>((t1,t2,t3...)=>{...});
2、Func 委托,有N个入参,一个返回值,最后一个参数tn是返回值类型 Func<t1,t2,t3...,tn> func = new Func<t1,t2,t3...,tn>((t1,t2,t3...)=>{... return tnObj;});
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //定义一个委托以及对应实现,入参string类型。 Action< string > act = new Action< string >((name) => { Console.WriteLine( "Action 线程:" + Thread.CurrentThread.ManagedThreadId + "," + name); }); //开启一个线程,调用委托 Task.Run(() => act( "jay" )); //定义一个委托以及对应实现,入参string类型,发挥string类型。 Func< string , string > func1 = new Func< string , string >((name) => { return "Func 线程:" + Thread.CurrentThread.ManagedThreadId + "," + "hello," + name; }); Func< string , string > func2 = ((name) => { return "Func 线程:" + Thread.CurrentThread.ManagedThreadId + "," + "hello," + name; }); //开启线程 Task< string > t1 = Task.Run(() => func1( "jay" )); Console.WriteLine(t1.Result); Task< string > t2 = Task.Run(() => func2( "jack" )); Console.WriteLine(t2.Result); //输出 //Action 线程:5,jay //Func 线程: 4,hello,jay //Func 线程: 5,hello,jack |
Action和Func是3.5新增的,这样就不用自己再去定义委托了,抛弃delegate吧
3、Task 一种新的多线程多任务的用法,具体分配线程有.net底层控制。在Task中组合使用async和await,在方法上加 async,方法体内需要有 await,没有await的话,会出现warn警告。async单独出现是没有作用的。
await只能出现在Task前面。await Task的后面的代码会被封装成一个回调,等待 await Task执行完毕后调用,使用的线程是await Task的线程;而Task.Wait()不会。
await是创建一个子线程执行,而Task.Wait()是主线程等待Task完成,会卡主线程。
public static async void TestIt(){...await...}可以变为Task返回:public static async Task TestIt(){...await...}
如果 async 标注的方法是带返回值的Task,那么返回结果是Task<T>,T就是返回值的类型,被Task包裹了一层, 例如:Task<long> t = sum();long num = t.Result;//也可以用 t.Wait() 来得到。
1 2 3 4 5 6 7 | public async Task< string > SayHello( string name) { return await Task.Run(() => { return "Task 线程:" + Thread.CurrentThread.ManagedThreadId + "," + "hello," + name; }); } Task< string > t3 = new TaskTest().SayHello( "打工人" ); Console.WriteLine(t3.Result); |
async、await是4.5的特性,使用他代码更清晰、便捷,抛弃Thread吧。
4、Thread.Sleep(1000) 和 Task.Delay(1000) 的区别
Thread.Sleep是同步延迟,会阻塞线程,无法取消;Task.Delay是异步延迟不会阻塞线程,可以取消,消耗更多资源,创建一个执行指定时间的空闲任务达到延迟的效果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】