مشاركة عبر


كيفية القيام بما يلي: إلغاء الأمر متوازى.For أو تكرار حلقي ForEach

Parallel.For Parallel.ForEachوظائف تدعم الإلغاء من خلال استخدام من الذي الرموز المميزة للإلغاء. للحصول على مزيد من المعلومات حول إلغاء بشكل عام، راجع الإلغاء. في متوازى تكرار حلقي، توفرها CancellationTokenالأسلوب في ParallelOptionsالمعلمة وثم قم بتضمين متوازى الاتصال في محاولة catch حظر.

مثال

يوضح المثال التالي كيفية إلى إلغاء الأمر مكالمة إلى ParallelForEach(). يمكنك يطبق الطريقة نفسها إلى Parallel.Forالمكالمة.

' How to: Cancel a Parallel.For or ForEach Loop

Imports System.Threading
Imports System.Threading.Tasks

Module CancelParallelLoops

    Sub Main()

        Dim nums() As Integer = Enumerable.Range(0, 10000000).ToArray()
        Dim cts As New CancellationTokenSource

        ' Use ParallelOptions instance to store the CancellationToken
        Dim po As New ParallelOptions
        po.CancellationToken = cts.Token
        po.MaxDegreeOfParallelism = System.Environment.ProcessorCount
        Console.WriteLine("Press 'c' to cancel.")

        ' Run a task so that we can cancel from another thread.
        Dim t As Task = Task.Factory.StartNew(Sub()
                                                  If Console.ReadKey().KeyChar = "c"c Then
                                                      cts.Cancel()
                                                  End If
                                                  Console.WriteLine(vbCrLf & "Press any key to exit.")
                                              End Sub)

        Try

            ' The error "Exception is unhandled by user code" will appear if "Just My Code" 
            ' is enabled. This error is benign. You can press F5 to continue, or disable Just My Code.
            Parallel.ForEach(nums, po, Sub(num)
                                           Dim d As Double = Math.Sqrt(num)
                                           Console.CursorLeft = 0
                                           Console.Write("{0:##.##} on {1}", d, Thread.CurrentThread.ManagedThreadId)
                                           po.CancellationToken.ThrowIfCancellationRequested()
                                       End Sub)

        Catch e As OperationCanceledException
            Console.WriteLine(e.Message)
        End Try

        Console.ReadKey()

    End Sub
End Module
namespace CancelParallelLoops
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;

    class Program
    {
        static void Main()
        {
            int[] nums = Enumerable.Range(0, 10000000).ToArray();
            CancellationTokenSource cts = new CancellationTokenSource();

            // Use ParallelOptions instance to store the CancellationToken
            ParallelOptions po = new ParallelOptions();
            po.CancellationToken = cts.Token;
            po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

            // Run a task so that we can cancel from another thread.
            Task.Factory.StartNew(() =>
            {
                if (Console.ReadKey().KeyChar == 'c')
                    cts.Cancel();
                Console.WriteLine("press any key to exit");
                Console.ReadKey();
            });

            try
            {
                Parallel.ForEach(nums, po, (num) =>
                {
                    double d = Math.Sqrt(num);
                    Console.WriteLine("{0} on {1}", d, Thread.CurrentThread.ManagedThreadId);
                    po.CancellationToken.ThrowIfCancellationRequested();
                });
            }
            catch (OperationCanceledException e)
            {
                Console.WriteLine(e.Message);
            }

            Console.ReadKey();

        }
    }
}

إذا كان الرمز المميز الذي إشارات الإلغاء هو نفس الرمز المميز الذي هو المحدد في ParallelOptionsمثيل، ثم تكرار حلقي المتوازية طرح واحدة OperationCanceledExceptionتشغيل الإلغاء. إذا رمز آخر الإلغاء، الحلقة سوف يقوم بطرح AggregateExceptionمع OperationCanceledExceptionكـ على InnerException.

راجع أيضًا:

المبادئ

بيانات متوازى ism (مكتبة متوازى المهام)

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