posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 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 27 28 29
30 31 1 2 3 4 5

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是异步延迟不会阻塞线程,可以取消,消耗更多资源,创建一个执行指定时间的空闲任务达到延迟的效果。

posted on   邢帅杰  阅读(523)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示