程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Parallel Programming-Task Result && Continuation Task,parallelprogramming

Parallel Programming-Task Result && Continuation Task,parallelprogramming

編輯:C#入門知識

Parallel Programming-Task Result && Continuation Task,parallelprogramming


本文主要介紹帶有返回值的Task和Continuation Task

一、帶返回值的Task

1.1代碼演示

前一篇博客介紹了Task,主要是沒有返回值的Task。本文所介紹的帶有返回值的Task,返回值通過task.Result進行讀取。

  class TaskFuture
    {
        public int Action()
        {
            Thread.Sleep(2000);
            return 1;
        }

        public int FutureDemo()
        {
            var task = Task.Factory.StartNew<int>(Action); ;
            return task.Result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var stopwatch = Stopwatch.StartNew();
            stopwatch.Start();
            var result = new TaskFuture().FutureDemo();
            Console.WriteLine(result);
            Console.WriteLine("Finished");
            Console.Read();
        }
    }

1.2 執行流程

當訪問task.Result的時候有可能Task還沒有開始執行或者Task還沒有執行完畢,這個時候當前線程會被block,一直到task完成並返回result為止。類似於Task.Wait()。當調用Task.Wait()時,調用線程會被block直到Task完成為止。

有一點額外說明:如果在調用Task.Result的時候Task還沒有開始,這個Task有可能不會再啟用新的線程,而是直接在當前的線程運行(inline)。變成了串行。

1.3 運行結果

上面的運行結果展示了上面所說的”block“

 二、Continuation Task

Continuation Task是指在某Task處於某種狀態的時候繼續執行其他Task的操作。

2.1代碼演示

  class ContinueTask
    {
        public int Action()
        {
            Console.WriteLine("in Action");
            return 1;
        }

        public void Continue()
        {
            var task = Task.Factory.StartNew<int>(Action);
            var continueTask = task.ContinueWith<int>(t =>
            {
                Console.WriteLine("in continue Task");
                return 2;
            });
            Console.WriteLine("The result of continie task is " + continueTask.Result);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var stopwatch = Stopwatch.StartNew();
            stopwatch.Start();
            new ContinueTask().Continue();
            Console.WriteLine("Finished");
            Console.Read();
        }
    }

2.2 運行結果

2.3 實際應用

ContinueTask可以在多個Task並行執行的時候執行取消操作。詳情點擊。

三、 Task.Factory.ContinueWhenAll

ContinueWhenAll即多任務延續。是指在多個Task完成的時候繼續執行某一個Task。

3.1代碼演示

  class ContinueTask
    {
        public int Action1()
        {
            Console.WriteLine("in Action1");
            return 1;
        }

        public int Action2()
        {
            Console.WriteLine("in Action2");
            return 2;
        }
        public void Continue()
        {
            var task1 = Task.Factory.StartNew<int>(Action1);
            var task2 = Task.Factory.StartNew<int>(Action2);

            var continueTask = Task.Factory.ContinueWhenAll<int>(new Task[] { task1, task2 }, (tasks) =>
            {
                Console.WriteLine("in Continue Task");
                return task1.Result + task2.Result;
            });
            Console.WriteLine("The result of continie task is " + continueTask.Result);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var stopwatch = Stopwatch.StartNew();
            stopwatch.Start();
            new ContinueTask().Continue();
            Console.WriteLine("Finished");
            Console.Read();
        }
    }

上面的延續任務中還使用了task1和task2的result。

3.2 運行結果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved