协作式取消只能取消一次,如果想实现类似于开关的联动式协作,还得依赖于开关量,此时可以使用原子锁实现。
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");
}
}
}
}