We can cancel the Parallel.For or Parallel.ForEach using a CancellationToken as shown below:
namespace CancelParallelLoops
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    class Program
    {
public 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;
            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 == 'c')
cts.Cancel();
                Console.WriteLine("press any key to exit");
});
            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();
}
}
}
 
No comments:
Post a Comment