组合任务
using System; using System.Text; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; 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.ContinueWith(t1 => Console.WriteLine("任务task1执行成功返回值:{0} -线程Id:{1} - {2}", t1.Result, t1.Id, DateTime.Now.ToString()), TaskContinuationOptions.OnlyOnRanToCompletion);
task1.ContinueWith(t1 => Console.WriteLine("任务task1执行失败时返回的信息,线程Id:{0}", t1.Id), TaskContinuationOptions.OnlyOnFaulted); task1.Start(); task2.Start(); Console.WriteLine("休眠3秒"); Thread.Sleep(TimeSpan.FromMilliseconds(3000)); Task task2Continue = task2.ContinueWith(t2 => Console.WriteLine("任务task2执行成功返回值:{0} , 线程Id:{1} , {2}", t2.Result, t2.Id, DateTime.Now.ToString()), TaskContinuationOptions.NotOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously); //TaskContinuationOptions.ExecuteSynchronously选项,尝试同步执行该后续操作。 task2Continue.GetAwaiter().OnCompleted(() => Console.WriteLine("线程Id:{0},是否后台线程:{1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsBackground)); Console.WriteLine("再休眠3秒"); Thread.Sleep(TimeSpan.FromMilliseconds(3000)); Task taskFinally = new Task<int>(() => { //创建一个新任务,当运行该任务时,通过TaskCreationOptions.AttachedToParent选项来运行一个子任务。 //子任务必须在父任务运行时创建,并正确的附加给父任务。 var innerTask = Task.Factory.StartNew(() => TaskMethod("innerTask"), TaskCreationOptions.AttachedToParent); innerTask.ContinueWith(t => TaskMethod("innerTaskContinue"), TaskContinuationOptions.AttachedToParent); //只有所有子任务结束工作,父任务才会完成。 //通过提供一个TaskContinuationOptions.AttachedToParent选项也可以在子任务上运行后续操作。 //该后续操作也会影响父任务,并且直到最后一个子任务结束,它才会运行完成。 return TaskMethod("taskFinally返回值"); }); taskFinally.Start(); while (taskFinally.IsCompleted == false) { Console.WriteLine("taskFinally的线程状态:{0}", taskFinally.Status.ToString()); Thread.Sleep(500); } 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: 8 主线程Main()的是否使用线程池: False 主线程Main()的是否后台线程: False 主线程Main()的线程状态: Running 主线程Main()的当前时间: 2016-08-28 19:19:50 休眠3秒 任务名称:task11 , 2016-08-28 19:19:50 任务名称:task22 , 2016-08-28 19:19:50 task22线程Id: 10 task22是否使用线程池: True task22是否后台线程: True task22线程状态: Background task22当前时间: 2016-08-28 19:19:50 task11线程Id: 9 task11是否使用线程池: True task11是否后台线程: True task11线程状态: Background task11当前时间: 2016-08-28 19:19:50 任务task1执行成功返回值:9 -线程Id:2 - 2016/8/28 19:19:52 再休眠3秒 线程Id:12,是否后台线程:True taskFinally的线程状态:WaitingToRun 任务名称:innerTask , 2016-08-28 19:19:56 innerTask线程Id: 11 innerTask是否使用线程池: True innerTask是否后台线程: True innerTask线程状态: Background innerTask当前时间: 2016-08-28 19:19:56 任务名称:taskFinally返回值 , 2016-08-28 19:19:56 taskFinally返回值线程Id: 12 taskFinally返回值是否使用线程池: True taskFinally返回值是否后台线程: True taskFinally返回值线程状态: Background taskFinally返回值当前时间: 2016-08-28 19:19:56 taskFinally的线程状态:Running taskFinally的线程状态:Running taskFinally的线程状态:Running 任务名称:innerTaskContinue , 2016-08-28 19:19:58 innerTaskContinue线程Id: 9 innerTaskContinue是否使用线程池: True innerTaskContinue是否后台线程: True innerTaskContinue线程状态: Background innerTaskContinue当前时间: 2016-08-28 19:19:58 taskFinally的线程状态:WaitingForChildrenToComplete taskFinally的线程状态:WaitingForChildrenToComplete taskFinally的线程状态:WaitingForChildrenToComplete taskFinally的线程状态:WaitingForChildrenToComplete 执行完成 */

浙公网安备 33010602011771号