C# Task 等待的多种方案
注意:wait没有返回值
一、Result
1、特点
阻塞主线程,直到获取返回结果
2、语法
task.Result
2、案例
Console.WriteLine("开始执行"); Task<int> task = Task.Run<int>(() => { Thread.Sleep(1000 * 3); return 10; }); // 获取线程运行的结果用作下面的运算 int result = task.Result; Console.WriteLine(result + 20); Console.WriteLine("结束执行");
二、Task
1、特点:阻塞主线程(UI)
2、语法
Task.WaitAll(task数组),等待所有task数组任务执行结束后,执行后面的任务
Task.WaitAny(task数组),等待任一task数组任务执行结束后,执行后面的任务
3、案例
private void btnAsyn_Click(object sender, EventArgs e) { List<Task> tasks = new List<Task>(); Console.WriteLine("开始执行"); Console.WriteLine("准备工作1"); Console.WriteLine("准备工作2"); Console.WriteLine("准备工作3"); TaskFactory factory = new TaskFactory(); tasks.Add(factory.StartNew(() => this.Print("张三","产能"))); tasks.Add(factory.StartNew(() => this.Print("李四","人力"))); tasks.Add(factory.StartNew(() => this.Print("王五","用户"))); tasks.Add(factory.StartNew(() => this.Print("李二","权限"))); Task.WaitAny(tasks.ToArray()); Console.WriteLine("已经完成部分任务,可以休息一下"); Task.WaitAll(tasks.ToArray()); Console.WriteLine("已经完成全部任务,拿钱走人"); Console.WriteLine("结束执行"); } private void Print(String name, String work) { Random random = new Random(); Console.WriteLine($"开始--{name},负责{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Thread.Sleep(500 * random.Next(2,6)); Console.WriteLine($"结束--{name},负责{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); }
三、TaskFactory
1、特点
不阻塞主线程
2、语法
factory.ContinueWhenAll(tasks.ToArray(),(obj)=>{}),创建延续任务,该任务在指定的一组任务,完成后执行
factory.ContinueWhenAny(tasks.ToArray(),(obj)=>{}),创建延续任务,它在指定的一组任务,任何任务完成后执行
3、案例
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine($"开始准备工作1,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Console.WriteLine($"开始准备工作2,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Console.WriteLine($"开始准备工作3,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); TaskFactory factory = new TaskFactory(); List<Task> tasks = new List<Task>(); tasks.Add(factory.StartNew(() => this.Print("张三", "产能"))); tasks.Add(factory.StartNew(() => this.Print("李四", "人力"))); tasks.Add(factory.StartNew(() => this.Print("王五", "用户"))); tasks.Add(factory.StartNew(() => this.Print("李二", "权限"))); // 创建延续Task,它将在指定的一组任务任何任务完成后,执行 factory.ContinueWhenAny(tasks.ToArray(), (obj) => { Console.WriteLine("有同学已经完成任务了,请其他同学继续努力,大家加油!"); }); // 创建延续任务,该任务在指定的一组任务完成后,执行 factory.ContinueWhenAll(tasks.ToArray(), (obj) => { Console.WriteLine($"结束工作,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")},{obj} "); }); } public void Print(string name, string work) { Random rnd = new Random(); Console.WriteLine($"{name}开启, 负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Thread.Sleep(500*rnd.Next(1, 9)); Console.WriteLine($"{name}结束,负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); }
4、传递值
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine($"开始准备工作1,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Console.WriteLine($"开始准备工作2,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Console.WriteLine($"开始准备工作3,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); TaskFactory factory = new TaskFactory(); List<Task> tasks = new List<Task>(); tasks.Add(factory.StartNew((obj) => this.Print("张三", "产能"),"张三")); tasks.Add(factory.StartNew((obj) => this.Print("李四", "人力"), "李四")); tasks.Add(factory.StartNew((obj) => this.Print("王五", "用户"), "王五")); tasks.Add(factory.StartNew((obj) => this.Print("李二", "权限"), "李二")); // 创建延续Task,它将在指定的一组任务任何任务完成后,执行 factory.ContinueWhenAny(tasks.ToArray(), (obj) => { Console.WriteLine($"{obj.AsyncState}同学已经完成任务了,请其他同学继续努力,大家加油!"); }); // 创建延续任务,该任务在指定的一组任务完成后,执行 factory.ContinueWhenAll(tasks.ToArray(), (obj) => { Console.WriteLine($"结束工作,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")},{obj} "); }); } public void Print(string name, string work) { Random rnd = new Random(); Console.WriteLine($"{name}开启, 负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Thread.Sleep(500*rnd.Next(1, 9)); Console.WriteLine($"{name}结束,负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); }

浙公网安备 33010602011771号