本文主要是介绍协作式取消paralle.for,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
协作式取消只能取消一次,如果想实现类似于开关的联动式协作,还得依赖于开关量,此时可以使用原子锁实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp53
{class Program{static void Main(string[] args){var cts = new CancellationTokenSource();var tf = new TaskFactory(cts.Token);tf.StartNew(() => DoSomething1(cts.Token));tf.StartNew(() => DoSomething2(cts.Token));Console.ReadKey();cts.Cancel();Console.WriteLine(DoSomething3());Console.ReadKey();}static async Task DoSomething3(){while (true){Console.WriteLine("Done;");await Task.Delay(1000);}}static void DoSomething1(CancellationToken token){Console.WriteLine("hello do something1");ParallelOptions ops = new ParallelOptions();ops.CancellationToken = token;try{Parallel.For(0, 100000, ops, (n) =>{ops.CancellationToken.ThrowIfCancellationRequested();Console.WriteLine(n);Task.Delay(1000);});}catch (OperationCanceledException){Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine("DoSomething1 Canceled");}}static void DoSomething2(CancellationToken token){Console.WriteLine("hello do something2");ParallelOptions ops = new ParallelOptions();ops.CancellationToken = token;try{Parallel.For(0, 100000, (n) =>{ops.CancellationToken.ThrowIfCancellationRequested();Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));Task.Delay(1000);});}catch (OperationCanceledException){Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine("DoSomething2 Canceled");}}}
}
这篇关于协作式取消paralle.for的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!