TaskFactory的简单使用
上代码:
目前有方法Coding:
private void Coding(string name) { Console.WriteLine($"Coding开始"); Thread.Sleep(3000); Console.WriteLine($"参数:{name},本次线程ID是 {Thread.CurrentThread.ManagedThreadId.ToString("00")}"); Console.WriteLine($"Coding结束"); }
执行代码:
TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); taskList.Add(taskFactory.StartNew(() => this.Coding("参数1"))); taskList.Add(taskFactory.StartNew(() => this.Coding("参数2"))); taskList.Add(taskFactory.StartNew(() => this.Coding("参数3"))); taskList.Add(taskFactory.StartNew(() => this.Coding("参数4"))); taskList.Add(taskFactory.StartNew(() => this.Coding("参数5"))); //当taskList中执行完任意一个任务时,非阻塞式的回调 taskFactory.ContinueWhenAny(taskList.ToArray(), t => { Console.WriteLine($"有一个任务执行完成"); }); //当taskList中执行完所有任务时,非阻塞式的回调 taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray(), rArray => { Console.WriteLine($"所有任务执行完成"); }));
执行结果:
关键代码说明:
taskFactory.ContinueWhenAny:当taskList中执行完任意一个任务时,执行本方法中的回调方法,非阻塞式的回调;
taskFactory.ContinueWhenAll:当taskList中执行完所有任务时,执行本方法中的回调方法,非阻塞式的回调
注:ContinueWhenAny ContinueWhenAll 非阻塞式的回调;而且使用的线程可能是新线程,也可能是刚完成任务的线程,唯一不可能是主线程
另外,除了这两个非阻塞式回调,还有两个相同作用的阻塞式回调,分别是Task.WaitAny和Task.WaitAll