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

posted on 2017-11-15 15:10  邢帅杰  阅读(440)  评论(0编辑  收藏  举报