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

posted @ 2021-08-27 08:14  静下心来邹  阅读(270)  评论(0编辑  收藏  举报