组合任务

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

执行完成
 
*/

 

posted @ 2016-08-30 13:22  茗::流  阅读(165)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。