多线程2——Task
1.创建和启动Task任务
Task task1 = new Task(() => { Console.WriteLine("通过Start启动Task任务"); }); task1.Start(); Task.Run(() => { Console.WriteLine("通过Run启动Task任务"); }); TaskFactory taskFactory = new TaskFactory(); taskFactory.StartNew(() => { Console.WriteLine("通过工厂代理启动任务"); });
2.多个任务
List<Task> tasks = new List<Task>(); for (int i = 0; i < 100; i++) { int j = i; tasks.Add(Task.Run(() => { Thread.Sleep(1000); Console.WriteLine($"{j}"); })); } Task.WaitAny(tasks.ToArray()); Console.WriteLine("只用等待一个"); Task.WaitAll(tasks.ToArray()); Console.WriteLine("等待全部完成");
3.多任务不卡界面等待
TaskFactory taskFactory2 = new TaskFactory(); List<Task> tasks2 = new List<Task>(); for (int i = 0; i < 100; i++) { int j = i; tasks2.Add(taskFactory2.StartNew(() => { Thread.Sleep(1000); Console.WriteLine($"{j}"); },TaskCreationOptions.LongRunning)); } taskFactory2.ContinueWhenAll(tasks2.ToArray(), (ss) => { Console.WriteLine($"最后{ss.Length}"); });
4. TaskCreationOptions类
①.AttachedToParent:指定将任务附加到任务层次结构中的某个父级,父任务必须等待所有子任务执行完毕才能执行
②. DenyChildAttach: 不允许子任务附加到父任务上
③. HideScheduler: 子任务不使用父类Task的Scheduler,而是使用默认的
④. LongRunning:当已知是长时间运行的任务,可以使用该选项
⑤. PreferFairness:类似于队列的感觉,尽可能公平的方式安排任务
5.多任务控制线程数量
TaskFactory taskFactory3 = new TaskFactory(); List<Task> tasks3 = new List<Task>(); for (int i = 0; i < 100; i++) { int j = i; if (tasks3.Where(s => s.Status != TaskStatus.RanToCompletion).ToList().Count > 9) { Thread.Sleep(500); Task.WaitAny(tasks3.ToArray()); tasks3 = tasks3.Where(s => s.Status != TaskStatus.RanToCompletion).ToList(); } tasks3.Add(taskFactory3.StartNew(() => { Console.WriteLine($"{tasks3.Count}"); })); }