Task 创建 传参 等待 回调 获取返回值



创建Task并执行

创建

/第一种 无参数方式

TaskFactory taskfactory = new TaskFactory();
                //第一种创建方式 无参数
                for (int i = 0; i < 5; i++)
                {
                    taskfactory.StartNew(new Action(() => {
                        Thread.Sleep(new Random().Next(0,1000));
                        Console.WriteLine("这里是Task第一种创建方式,线程ID为{0}",Thread.CurrentThread.ManagedThreadId);
                    }));
                }

结果



//第一种 有参数

Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
                TaskFactory taskfactory = new TaskFactory();
                //第一种创建方式 有参数
                for (int i = 0; i < 5; i++)
                {
                    taskfactory.StartNew(new Action<object>(t => {
                        Thread.Sleep(new Random().Next(0,1000));
                        Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}",Thread.CurrentThread.ManagedThreadId,t);
                    }),i);
                }


                Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);

结果:



Task.Run方式

for (int i = 0; i < 5; i++)
                {
                    
                    Task.Run(new Action(() => {
                            Thread.Sleep(new Random().Next(0,1000));
                            Console.WriteLine("这里是Task第一种创建方式,线程ID为{0}",Thread.CurrentThread.ManagedThreadId);
                    }));
                }


等待

Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
                TaskFactory taskfactory = new TaskFactory();
                List<Task> taskList = new List<Task>();
                //第一种创建方式 有参数
                for (int i = 0; i < 5; i++)
                {
                    taskList.Add(taskfactory.StartNew(new Action<object>(t =>
                     {
                         Thread.Sleep(new Random().Next(200, 5000));//这里只是为了让不同任务时间执行不同
                         Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}", Thread.CurrentThread.ManagedThreadId, t);
                     }), i));                 
                }
                //等待某一个
                Task.WaitAny(taskList.ToArray());
                Console.WriteLine("某一个执行完之后就执行这句话哦");
                //等待所有
                Task.WaitAll(taskList.ToArray());

                Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);

结果



回调

Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
                TaskFactory taskfactory = new TaskFactory();
                List<Task> taskList = new List<Task>();
                //第一种创建方式 有参数
                for (int i = 0; i < 5; i++)
                {
                    taskList.Add(taskfactory.StartNew(new Action<object>(t =>
                     {
                         Thread.Sleep(new Random().Next(200, 5000));//这里只是为了让不同任务时间执行不同
                         Console.WriteLine("这里是Task第一种创建方式,线程ID为{0},参数为:{1}", Thread.CurrentThread.ManagedThreadId, t);
                     }), i));                 
                }

                //完成某一个 即执行回调
                taskfactory.ContinueWhenAny(taskList.ToArray(), t => {
                    Console.WriteLine("执行完某一个之后立即执行的回调函数,参数值{0},执行是否结束{1}线程ID{2}",t.AsyncState,t.IsCompleted,Thread.CurrentThread.ManagedThreadId);
                });

                //所有都执行完之后 执行回调函数
                taskfactory.ContinueWhenAll(taskList.ToArray(), t => {
                    foreach (Task item in t)
                    {
                        Console.WriteLine("回调函数 参数{0},是否执行完毕{1},线程ID{2}", item.AsyncState, item.IsCompleted, Thread.CurrentThread.ManagedThreadId);
                    }
                });



                Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);

结果



获取返回值

获取返回值 我没想到太好的方法 只能通过外面包一层 来实现获取  以后有好多方法 再来更新

 static void Main(string[] args)
        {

            try
            {
                Console.WriteLine("***************程序开始 线程ID:{0}*******************",Thread.CurrentThread.ManagedThreadId);
                TaskFactory taskfactory = new TaskFactory();
                List<Task> taskList = new List<Task>();
                //第一种创建方式 有参数
                for (int i = 0; i < 5; i++)
                {
                    taskList.Add(taskfactory.StartNew(new Action<object>(t =>
                     {
                         string value=GetValue((int)t);
                         Thread.Sleep(new Random().Next(200, 1000));//这里只是为了让不同任务时间执行不同
                         Console.WriteLine("把方法包了一层 获取到返回值为{0}",value);
                     }), i));                 
                }              



                Console.WriteLine("***************程序结束 线程ID:{0}*******************", Thread.CurrentThread.ManagedThreadId);

                Console.Read();
            }
            catch (Exception ex)
            {

                throw;
            }
        }


        public static string GetValue(int i)
        {
            return i.ToString();
        }

结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值