并行运行任务
using System; using System.Text; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks;
namespace Test { class Program {
/// <summary> /// 并行运行任务 /// </summary> static void Main() { CurrentThreadInfo("主线程Main()的"); Task<int> task1 = new Task<int>(() => TaskMethod("task11")); Task<int> task2 = new Task<int>(() => TaskMethod("task22")); task1.Start(); task2.Start(); var whenAllTask = Task.WhenAll(task1, task2); whenAllTask.ContinueWith(t => Console.WriteLine("任务一的返回值:{0}, 任务二的返回值:{1}, {2}", t.Result[0], t.Result[1], DateTime.Now.ToString()), TaskContinuationOptions.OnlyOnRanToCompletion); //task1.Start(); //task2.Start(); Console.WriteLine("休眠3秒,{0}", DateTime.Now.ToString()); Thread.Sleep(TimeSpan.FromMilliseconds(3000)); Console.WriteLine("休眠3秒后,{0}", DateTime.Now.ToString()); var taskArray = new List<Task<int>>(); for (int i = 1; i < 5; i++) { int counter = i; var task = new Task<int>(() => TaskMethod(String.Format("taskArray任务集合{0}的", counter))); taskArray.Add(task); task.Start(); } while (taskArray.Count > 0) { var completedTask = Task.WhenAny(taskArray).Result; taskArray.Remove(completedTask); Console.WriteLine("完成该任务的completedTask线程Id:{0},completedTask任务的返回结果:{1} , {2}", completedTask.Id, completedTask.Result, DateTime.Now.ToString()); } Console.WriteLine("\n执行完成"); Console.ReadLine(); } private static int TaskMethod(string name) { Console.WriteLine("任务名称:{0} , {1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); CurrentThreadInfo(name); Thread.Sleep(TimeSpan.FromMilliseconds(2000)); return Thread.CurrentThread.ManagedThreadId; } /// <summary> /// 当前线程信息 /// </summary> private static void CurrentThreadInfo(string name) { StringBuilder builder = new StringBuilder(); builder.AppendLine(""); builder.AppendLine(String.Format("{0}线程Id:\t\t{1}", name, Thread.CurrentThread.ManagedThreadId)); builder.AppendLine(String.Format("{0}是否使用线程池:\t{1}", name, Thread.CurrentThread.IsThreadPoolThread)); builder.AppendLine(String.Format("{0}是否后台线程:\t{1}", name, Thread.CurrentThread.IsBackground)); builder.AppendLine(String.Format("{0}线程状态:\t\t{1}", name, Thread.CurrentThread.ThreadState.ToString())); builder.AppendLine(String.Format("{0}当前时间:\t\t{1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); builder.AppendLine(""); Console.WriteLine(builder.ToString()); } } }
打印运行结果:
/* 主线程Main()的线程Id: 9 主线程Main()的是否使用线程池: False 主线程Main()的是否后台线程: False 主线程Main()的线程状态: Running 主线程Main()的当前时间: 2016-08-28 22:56:43 休眠3秒,2016/8/28 22:56:43 任务名称:task11 , 2016-08-28 22:56:43 task11线程Id: 10 task11是否使用线程池: True task11是否后台线程: True task11线程状态: Background task11当前时间: 2016-08-28 22:56:43 任务名称:task22 , 2016-08-28 22:56:43 task22线程Id: 11 task22是否使用线程池: True task22是否后台线程: True task22线程状态: Background task22当前时间: 2016-08-28 22:56:43 任务一的返回值:10, 任务二的返回值:11, 2016/8/28 22:56:45 休眠3秒后,2016/8/28 22:56:46 任务名称:taskArray任务集合1的 , 2016-08-28 22:56:46 taskArray任务集合1的线程Id: 10 taskArray任务集合1的是否使用线程池: True taskArray任务集合1的是否后台线程: True taskArray任务集合1的线程状态: Background taskArray任务集合1的当前时间: 2016-08-28 22:56:46 任务名称:taskArray任务集合3的 , 2016-08-28 22:56:46 任务名称:taskArray任务集合2的 , 2016-08-28 22:56:46 taskArray任务集合2的线程Id: 11 taskArray任务集合2的是否使用线程池: True taskArray任务集合2的是否后台线程: True taskArray任务集合2的线程状态: Background taskArray任务集合2的当前时间: 2016-08-28 22:56:46 taskArray任务集合3的线程Id: 13 taskArray任务集合3的是否使用线程池: True taskArray任务集合3的是否后台线程: True taskArray任务集合3的线程状态: Background taskArray任务集合3的当前时间: 2016-08-28 22:56:46 任务名称:taskArray任务集合4的 , 2016-08-28 22:56:46 taskArray任务集合4的线程Id: 12 taskArray任务集合4的是否使用线程池: True taskArray任务集合4的是否后台线程: True taskArray任务集合4的线程状态: Background taskArray任务集合4的当前时间: 2016-08-28 22:56:46 完成该任务的completedTask线程Id:5,completedTask任务的返回结果:10 , 2016/8/28 22:56:48 完成该任务的completedTask线程Id:8,completedTask任务的返回结果:11 , 2016/8/28 22:56:48 完成该任务的completedTask线程Id:9,completedTask任务的返回结果:13 , 2016/8/28 22:56:48 完成该任务的completedTask线程Id:12,completedTask任务的返回结果:12 , 2016/8/28 22:56:48 执行完成 */

浙公网安备 33010602011771号