上代码:
目前有方法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