一、Task 是.NET Framwork 3.0 出现,线程是基于线程池的。
二、创建Task的三种方式
public void TaskMethod() { Console.WriteLine($"TaskMethod 开始执行,ManagedThreadId:{Thread.CurrentThread.ManagedThreadId}"); //启动线程 //1.Task task = new Task(() => Todo("TaskMethod")); //task.Start(); { Task task = new Task(() => Todo("Task")); task.Start(); } //2.Task.Run(() => Todo("TaskMethod")); { Task.Run(() => Todo("Run")); } //3.Task.Factory.StartNew(() => Todo("TaskMethod")); { Task.Factory.StartNew(() => Todo("StartNew")); } Console.WriteLine($"TaskMethod 开始执行,ManagedThreadId:{Thread.CurrentThread.ManagedThreadId}"); }
三、WaitAll 等待所有任务都完成了,在往下执行
public void TaskWaitAll() { //WaitAll 等待所有任务都完成了,在往下执行 List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { var k = i; var task = Task.Run(() => { Thread.Sleep(500); Console.WriteLine($"show is k ={k},ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("WaitAll执行完了....."); }
四、TaskWaitAny 有一个任务执行完了,就往下执行
public void TaskWaitAny() { //TaskWaitAny 有一个任务执行完了,就往下执行 List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { var k = i; var task = Task.Run(() => { Thread.Sleep(500); Console.WriteLine($"show is k ={k},ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); list.Add(task); } Task.WaitAny(list.ToArray()); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("WaitAny执行完了....."); }
五、WhenAll 等待所有任务都完成了,不阻塞的回调
public void TaskWhenAll() { //WhenAll 等待所有任务都完成了,往下执行,不阻塞的回调 List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { var k = i; var task = Task.Run(() => { Thread.Sleep(1000); Console.WriteLine($"show is k ={k},ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); list.Add(task); } Task.WhenAll(list.ToArray()).ContinueWith(s => { Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine($"TaskWhenAll执行完了,ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); }
六、WhenAny 等待所有任务都完成了,往下执行,不阻塞的回调
public void TaskWhenAny() { //WhenAny 等待所有任务都完成了,往下执行,不阻塞的回调 List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { var k = i; var task = Task.Run(() => { Thread.Sleep(1000); Console.WriteLine($"show is k ={k},ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); list.Add(task); } Task.WhenAny(list.ToArray()).ContinueWith(s => { Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine("等待中.............."); Console.WriteLine($"TaskWhenAny执行完了,ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); }
七、控制并发数量只有20个
public void ControlThreadNumber() { List<Task> tasks = new List<Task>(); for (int i = 0; i < 10000; i++) { var k = i; if (tasks.Count(t => t.Status != TaskStatus.RanToCompletion) >= 20) { Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(t => t.Status != TaskStatus.RanToCompletion).ToList(); } var task = Task.Run(() => { Thread.Sleep(500); Console.WriteLine($"show is k ={k},ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); }); tasks.Add(task); } }
八、Sleep和Delay的区别
1.Sleep执行时间更长,Delay 执行时间段
2.Sleep卡界面,阻塞,Delay 不卡界面,不阻塞
3.同步等待,当前线程数等待2S后继续,异步等待,等待2S后启用新线程
private void Todo(string name) { Console.WriteLine($"Todo 方法开始执行...."); long result = 0; for (int i = 0; i < 100000; i++) { result += i; } Thread.Sleep(500); Console.WriteLine($"Todo方法执行的结果:{result},名称{name},ManagedThreadId:{Thread.CurrentThread.ManagedThreadId}"); Console.WriteLine($"Todo 方法结束执行...."); }