连续任务2
using System; using System.Text; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Test { class Program { public static string DateTime_Now_ToString() { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } /// <summary> /// 连续任务(对任务进行排序) /// </summary> static void Main() { Console.WriteLine("当前时间:{0}\n", DateTime_Now_ToString()); Console.WriteLine(GetCurrentThreadInfo("主线程")); Thread.Sleep(TimeSpan.FromMilliseconds(1000)); //前置任务 Task<int> task1 = new Task<int>(() => { Console.WriteLine("task1任务开始," + DateTime.Now.ToString()); Thread.Sleep(TimeSpan.FromMilliseconds(5000)); int threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("task11内的线程Id:{0},{1}", threadId.ToString(), DateTime.Now.ToString()); CurrentThreadInfo("task11"); return threadId; }); Task<int> task2 = new Task<int>(() => { Console.WriteLine("task2任务开始," + DateTime.Now.ToString()); Thread.Sleep(TimeSpan.FromMilliseconds(2000)); int threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("task22内的线程Id:{0},{1}", threadId.ToString(), DateTime.Now.ToString()); CurrentThreadInfo("task22"); return threadId; }); //两个前置任务(task1,task2)的后续任务 Task totalTask = Task.Factory.ContinueWhenAll(new Task<int>[] { task1, task2 }, (allTask => { Console.WriteLine("totalTask任务开始," + DateTime.Now.ToString()); Thread.Sleep(TimeSpan.FromMilliseconds(3000)); int threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("totalTask内的线程Id:{0},{1}", threadId.ToString(), DateTime.Now.ToString()); CurrentThreadInfo("totalTask"); Thread.Sleep(TimeSpan.FromMilliseconds(2000)); Console.WriteLine("任务结果1:【{0}】,任务结果2:【{1}】,{2}", allTask[0].Result, allTask[1].Result, DateTime.Now.ToString()); })); task1.Start(); task2.Start(); Task.WaitAll(task1, task2); totalTask.Wait(); Console.WriteLine("\n执行完成" + DateTime_Now_ToString()); Console.ReadLine(); } private static string GetCurrentThreadInfo(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(""); return builder.ToString(); } /// <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()); } } }
打印运行结果:
/* 当前时间:2016-09-01 10:56:51 主线程线程Id: 9 主线程是否使用线程池: False 主线程是否后台线程: False 主线程线程状态: Running 主线程当前时间: 2016-09-01 10:56:51 task1任务开始,2016/9/1 10:56:52 task2任务开始,2016/9/1 10:56:52 task22内的线程Id:11,2016/9/1 10:56:54 task22线程Id: 11 task22是否使用线程池: True task22是否后台线程: True task22线程状态: Background task22当前时间: 2016-09-01 10:56:54 task11内的线程Id:10,2016/9/1 10:56:57 task11线程Id: 10 task11是否使用线程池: True task11是否后台线程: True task11线程状态: Background task11当前时间: 2016-09-01 10:56:57 totalTask任务开始,2016/9/1 10:56:57 totalTask内的线程Id:13,2016/9/1 10:57:00 totalTask线程Id: 13 totalTask是否使用线程池: True totalTask是否后台线程: True totalTask线程状态: Background totalTask当前时间: 2016-09-01 10:57:00 任务结果1:【10】,任务结果2:【11】,2016/9/1 10:57:02 执行完成2016-09-01 10:57:02 */

浙公网安备 33010602011771号