共用方式為


HOW TO:使用 Parallel.Invoke 執行平行作業

此範例說明如何使用工作平行程式庫中的 ParallelInvoke() 平行處理作業。 我們會對共用資料來源執行三項作業。 這些作業都不會修改來源,因此可以直接平行執行。

注意事項注意事項

本文件使用 Lambda 運算式來定義 TPL 中的委派。如果您不太熟悉 C# 或 Visual Basic 中的 Lambda 運算式,請參閱 PLINQ 和 TPL 中的 Lambda 運算式

範例

' How to: Use Parallel.Invoke to Execute Parallel Operations
Option Explicit On
Option Strict On

Imports System.Threading.Tasks
Imports System.Net

Module ParallelTasks

    Sub Main()
        ' Retrieve Darwin's "Origin of the Species" from Gutenberg.org.
        Dim words As String() = CreateWordArray("http://www.gutenberg.org/files/2009/2009.txt")

        '#Region "ParallelTasks"
        ' Perform three tasks in parallel on the source array
        Parallel.Invoke(Sub()
                            Console.WriteLine("Begin first task...")
                            GetLongestWord(words)
                            ' close first Action
                        End Sub,
            Sub()
                Console.WriteLine("Begin second task...")
                GetMostCommonWords(words)
                'close second Action
            End Sub,
            Sub()
                Console.WriteLine("Begin third task...")
                GetCountForWord(words, "species")
                'close third Action
            End Sub)
        'close parallel.invoke
        Console.WriteLine("Returned from Parallel.Invoke")
        '#End Region

        Console.WriteLine("Press any key to exit")
        Console.ReadKey()
    End Sub

#Region "HelperMethods"
    Sub GetCountForWord(ByVal words As String(), ByVal term As String)
        Dim findWord = From word In words _
            Where word.ToUpper().Contains(term.ToUpper()) _
            Select word

        Console.WriteLine("Task 3 -- The word ""{0}"" occurs {1} times.", term, findWord.Count())
    End Sub

    Sub GetMostCommonWords(ByVal words As String())
        Dim frequencyOrder = From word In words _
            Where word.Length > 6 _
            Group By word
            Into wordGroup = Group, Count()
            Order By wordGroup.Count() Descending _
            Select wordGroup

        Dim commonWords = From grp In frequencyOrder
                          Select grp
                          Take (10)

        Dim s As String
        s = "Task 2 -- The most common words are:" & vbCrLf
        For Each v In commonWords
            s = s & v(0) & vbCrLf
        Next
        Console.WriteLine(s)
    End Sub

    Function GetLongestWord(ByVal words As String()) As String
        Dim longestWord = (From w In words _
            Order By w.Length Descending _
            Select w).First()

        Console.WriteLine("Task 1 -- The longest word is {0}", longestWord)
        Return longestWord
    End Function


    ' An http request performed synchronously for simplicity.
    Function CreateWordArray(ByVal uri As String) As String()
        Console.WriteLine("Retrieving from {0}", uri)

        ' Download a web page the easy way.
        Dim s As String = New WebClient().DownloadString(uri)

        ' Separate string into an array of words, removing some common punctuation.
        Return s.Split(New Char() {" "c, ControlChars.Lf, ","c, "."c, ";"c, ":"c, _
        "-"c, "_"c, "/"c}, StringSplitOptions.RemoveEmptyEntries)
    End Function
#End Region


    ' Output (May vary on each execution):
    ' Retrieving from http://www.gutenberg.org/dirs/etext99/otoos610.txt
    ' Response stream received.
    ' Begin first task...
    ' Begin second task...
    ' Task 2 -- The most common words are:
    ' species
    ' selection
    ' varieties
    ' natural
    ' animals
    ' between
    ' different
    ' distinct
    ' several
    ' conditions
    '
    ' Begin third task...
    ' Task 1 -- The longest word is characteristically
    ' Task 3 -- The word "species" occurs 1927 times.
    ' Returned from Parallel.Invoke
    ' Press any key to exit 
    ' 
End Module
namespace ParallelTasks
{
    using System;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Net;

    class ParallelInvoke
    {
        static void Main()
        {
            // Retrieve Darwin's "Origin of the Species" from Gutenberg.org.
            string[] words = CreateWordArray(@"http://www.gutenberg.org/files/2009/2009.txt");

            #region ParallelTasks
            // Perform three tasks in parallel on the source array
            Parallel.Invoke(() =>
                             {
                                 Console.WriteLine("Begin first task...");
                                 GetLongestWord(words);
                             },  // close first Action

                             () =>
                             {
                                 Console.WriteLine("Begin second task...");
                                 GetMostCommonWords(words);
                             }, //close second Action

                             () =>
                             {
                                 Console.WriteLine("Begin third task...");
                                 GetCountForWord(words, "species");
                             } //close third Action
                         ); //close parallel.invoke

            Console.WriteLine("Returned from Parallel.Invoke");
            #endregion

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        #region HelperMethods
        private static void GetCountForWord(string[] words, string term)
        {
            var findWord = from word in words
                           where word.ToUpper().Contains(term.ToUpper())
                           select word;

            Console.WriteLine(@"Task 3 -- The word ""{0}"" occurs {1} times.",
                term, findWord.Count());
        }

        private static void GetMostCommonWords(string[] words)
        {
            var frequencyOrder = from word in words
                                 where word.Length > 6
                                 group word by word into g
                                 orderby g.Count() descending
                                 select g.Key;

            var commonWords = frequencyOrder.Take(10);

            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Task 2 -- The most common words are:");
            foreach (var v in commonWords)
            {
                sb.AppendLine("  " + v);
            }
            Console.WriteLine(sb.ToString());
        }

        private static string GetLongestWord(string[] words)
        {
            var longestWord = (from w in words
                               orderby w.Length descending
                               select w).First();

            Console.WriteLine("Task 1 -- The longest word is {0}", longestWord);
            return longestWord;
        }


        // An http request performed synchronously for simplicity.
        static string[] CreateWordArray(string uri)
        {
            Console.WriteLine("Retrieving from {0}", uri);

            // Download a web page the easy way.
            string s = new WebClient().DownloadString(uri);

            // Separate string into an array of words, removing some common punctuation.
            return s.Split(
                new char[] { ' ', '\u000A', ',', '.', ';', ':', '-', '_', '/' },
                StringSplitOptions.RemoveEmptyEntries);
        }
        #endregion
    }

    /* Output (May vary on each execution):
        Retrieving from http://www.gutenberg.org/dirs/etext99/otoos610.txt
        Response stream received.
        Begin first task...
        Begin second task...
        Task 2 -- The most common words are:
          species
          selection
          varieties
          natural
          animals
          between
          different
          distinct
          several
          conditions

        Begin third task...
        Task 1 -- The longest word is characteristically
        Task 3 -- The word "species" occurs 1927 times.
        Returned from Parallel.Invoke
        Press any key to exit  
     */
}

請注意,使用 Invoke() 時,您只需指出要並行執行的動作即可,執行階段會處理所有執行緒排程詳細資料,包括自動根據主機電腦的核心數進行調整。

此範例會平行處理作業,而不是資料。 除了前述方法以外,您也可以使用 PLINQ 來平行處理 LINQ 查詢,並依序執行查詢。 或者,您可以使用 PLINQ 來平行處理資料。 另一種方式是同時平行處理查詢和工作。 雖然產生的額外負荷可能會使處理器數目相對較少的主機電腦效能減低,但在具有較多處理器的電腦上將適用得多。

編譯程式碼

  • 將整個範例複製並貼到 Microsoft Visual Studio 2010 專案中,然後按 F5。

請參閱

工作

HOW TO:等候一個或多個工作完成

HOW TO:使用接續鏈結多個工作

HOW TO:取消工作及其子系

概念

以 .NET Framework 進行平行程式設計

平行 LINQ (PLINQ)