Lezen in het Engels

Delen via


Procedure: Een parallel.for- of ForEach-lus annuleren

De Parallel.For en Parallel.ForEach methoden ondersteunen annulering via het gebruik van annuleringstokens. Zie Annulering voor meer informatie over annulering in het algemeen. In een parallelle lus geeft u de CancellationToken methode op in de ParallelOptions parameter en plaatst u vervolgens de parallelle aanroep in een try-catch-blok.

Opmerking

In het volgende voorbeeld ziet u hoe u een aanroep annuleert naar Parallel.ForEach. U kunt dezelfde benadering toepassen op een Parallel.For gesprek.

namespace CancelParallelLoops
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;

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

            // Use ParallelOptions instance to store the CancellationToken
            ParallelOptions options = new()
            {
                CancellationToken = cts.Token,
                MaxDegreeOfParallelism = Environment.ProcessorCount
            };
            Console.WriteLine("Press any key to start. Press 'c' to cancel.");
            Console.ReadKey();

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

            try
            {
                Parallel.ForEach(nums, options, (num) =>
                {
                    double d = Math.Sqrt(num);
                    Console.WriteLine("{0} on {1}", d, Environment.CurrentManagedThreadId);
                });
            }
            catch (OperationCanceledException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                cts.Dispose();
            }

            Console.ReadKey();
        }
    }
}

Als het token dat de annulering aangeeft hetzelfde token is dat is opgegeven in het ParallelOptions exemplaar, genereert de parallelle lus één OperationCanceledException bij annulering. Hierdoor worden alle iteraties onmiddellijk gestopt wanneer de uitzondering wordt gegenereerd. Als een ander token annulering veroorzaakt, genereert de lus een AggregateException met een OperationCanceledException als een InnerException.

Zie ook