مشاركة عبر


كيفية القيام بما يلي: ربط مهام متعددة مع Continuations

في "مكتبة متوازى المهام"، مهمة له ContinueWith()أسلوب هو استدعاء هو تسمى antecedent المهمة والمهمة التي هو المعرفة في ContinueWith()أسلوب هو تسمى متابعة. يوضح هذا المثال كيفية إلى استخدام ContinueWith()طريقة Taskو Task<TResult>الفئات إلى تحديد مهام التي تبدأ بعد المهام الخاصة به antecedent ينتهي.

كما يوضح المثال كيفية متابعة يعمل فقط في حالة تحديد به antecedent هو إلغاؤها.

تبين الأمثلة التالية كيف إلى المتابعة من مهمة واحدة. يمكنك أيضا إنشاء متابعة التي يتم تنفيذها بعد أي أو كل مجموعة من المهام بإكمال أو يتم إلغاؤها. للمزيد من المعلومات، راجع TaskContinueWhenAll() وTaskContinueWhenAny().

مثال

DoSimpleContinuationأسلوب عرض بناء الجملة الأساسي ل ContinueWith(). لاحظ أن المهمة antecedent هو المتوفر كمعلمة إدخال للتعبير لامدا في ContinueWith()الأسلوب. يتيح لك ذلك إلى تقييم حالة مهمة antecedent قبل أن يقوم بإجراء أي عمل في المتابعة. استخدم هذا التحميل الزائد بسيط من ContinueWithإذا لم يكن لديك لتمرير أي الولاية من مهمة واحدة إلى أخرى.

DoSimpleContinuationWithStateالعروض أسلوب كيف إلى استخدام ContinueWithإلى تمرير الناتج من مهمة antecedent إلى متابعة مهمة.

Imports System.IO
Imports System.Threading
Imports System.Threading.Tasks
Module ContinueWith

    Sub Main()
        DoSimpleContinuation()

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


    Sub DoSimpleContinuation()
        Dim path As String = "C:\users\public\TPLTestFolder\"
        Try
            Dim firstTask = New Task(Sub() CopyDataIntoTempFolder(path))
            Dim secondTask = firstTask.ContinueWith(Sub(t) CreateSummaryFile(path))
            firstTask.Start()
        Catch e As AggregateException
            Console.WriteLine(e.Message)
        End Try
    End Sub

    ' A toy function to simulate a workload
    Sub CopyDataIntoTempFolder(ByVal path__1 As String)
        System.IO.Directory.CreateDirectory(path__1)
        Dim rand As New Random()
        For x As Integer = 0 To 49
            Dim bytes As Byte() = New Byte(999) {}
            rand.NextBytes(bytes)
            Dim filename As String = Path.GetRandomFileName()
            Dim filepath As String = Path.Combine(path__1, filename)
            System.IO.File.WriteAllBytes(filepath, bytes)
        Next
    End Sub

    Sub CreateSummaryFile(ByVal path__1 As String)
        Dim files As String() = System.IO.Directory.GetFiles(path__1)
        Parallel.ForEach(files, Sub(file)
                                    Thread.SpinWait(5000)
                                End Sub)

        System.IO.File.WriteAllText(Path.Combine(path__1, "__SummaryFile.txt"), "did my work")
        Console.WriteLine("Done with task2")
    End Sub

    Sub DoSimpleContinuationWithState()
        Dim nums As Integer() = {19, 17, 21, 4, 13, 8, _
        12, 7, 3, 5}
        Dim f0 = New Task(Of Double)(Function() nums.Average())
        Dim f1 = f0.ContinueWith(Function(t) GetStandardDeviation(nums, t.Result))

        f0.Start()
        Console.WriteLine("the standard deviation is {0}", f1)
    End Sub

    Function GetStandardDeviation(ByVal values As Integer(), ByVal mean As Double) As Double
        Dim d As Double = 0.0R
        For Each n In values
            d += Math.Pow(mean - n, 2)
        Next
        Return Math.Sqrt(d / (values.Length - 1))
    End Function
End Module
        static void SimpleContinuation()
        {
            string path = @"C:\users\public\TPLTestFolder\";
            try
            {
                var firstTask = new Task(() => CopyDataIntoTempFolder(path));
                var secondTask = firstTask.ContinueWith((t) => CreateSummaryFile(path));
                firstTask.Start();
            }
            catch (AggregateException e)
            {
                Console.WriteLine(e.Message);
            }
        }

        // A toy function to simulate a workload
        static void CopyDataIntoTempFolder(string path)
        {
            System.IO.Directory.CreateDirectory(path);
            Random rand = new Random();
            for (int x = 0; x < 50; x++)
            {
                byte[] bytes = new byte[1000];
                rand.NextBytes(bytes);
                string filename = Path.GetRandomFileName();
                string filepath = Path.Combine(path, filename);
                System.IO.File.WriteAllBytes(filepath, bytes);
            }
        }

        static void CreateSummaryFile(string path)
        {
            string[] files = System.IO.Directory.GetFiles(path);
            Parallel.ForEach(files, (file) =>
                {
                    Thread.SpinWait(5000);
                });

            System.IO.File.WriteAllText(Path.Combine(path, "__SummaryFile.txt"), "did my work");
            Console.WriteLine("Done with task2");
        }

معلمة نوع Task<TResult>يحدد نوع الإرجاع للمفوض. التي بإرجاع القيمة التي يتم تمريرها لمتابعة مهمة. يمكن أن يكون عدد المهام عشوائية chaفيed في هذه الطريقة.

راجع أيضًا:

المبادئ

البرمجة المتوازية في .NET Framework

لامدا التعبيرات في PLINQ و TPL

موارد أخرى

متابعة المهام

Parallelism مهمة (المهام مكتبة متوازٍ)