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;});
//定义一个委托以及对应实现,入参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() 来得到。
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是异步延迟不会阻塞线程,可以取消,消耗更多资源,创建一个执行指定时间的空闲任务达到延迟的效果。