#region 终止任务和取消任务
/*
* AppDomain (应用程序域,一般用来观察程序中未被捕捉的异常 有一个 UnhandledException 方法专门用来解决这种情况,当发现有未处理异常的时候他会强行把线程杀死(又叫野蛮终止)
* 这时程序处于中断模式)
*但这不是一个很好的方法,最佳的事件就是避免所有未处理异常,不管是是工作者线程还是主线程。
*
*当然, 还有一种温油的方法可以使线程终止(CancellationToken),那就是取消任务(又叫协作是取消,他和野蛮终止不同,他会等待当前线程执行完成后才会终止线程)相对于 App Domain 来说
* CancellatTokenSour.cancel() 并不是野蛮终止 正在执行的TAsk,任务会继续运行,直到他检查状态,发现标志所有者已发送请求状态,这时才会得体地关掉任务
* 调用cancel ()实际上会在 CancellationToken 复制的所有取消上设置 ISCancellationRequested 属性
* note:
* 提供给异步任务的是cancellationToken(而不是CancellationTokenSource, 他只是一个事件触发类)cancellationToken 是我们能轮询请求(并行编程的魅力),
* 而CancellationTokenSoure 负责提供标志,并在取消时发出通知(cancel() 方法接受信号(取消任务信号)
*
* CancellationToken 是结构,所以能复值,cts.Token 返回的是标志(也就是 Asyncoperation1()方法)的副本。
*
* 为了监视ISCancellationRequested 属性,CancellationToken的一个实例(从cancellationTokenSoure.Token 获取) 传给并行任务 ,Asyncoperation4 方法 每次循环都会检查
* ISCancellationRequested 属性,如果返回true就退出
*
* 说明书上提到 的register()方法(重载),通过这个方法可以登记一个操作,在标志取消时调用,调用 Register()方法将登记
* cancellationTokenSoure的cancel 上的一个监视器
*/
//举个栗子 AppDomain 下的 UnhandledException 方法
//public class Program
//{
#region AppDomain
// public static Stopwatch clock = new Stopwatch();//计时器
// public static void Main()
// {
// try
// {
// clock.Start();
// /*
// * s 未处理异常事件的源 e 一个包含事件数据的UnhandledExceptionEventArgs。
// UnhandledExceptionEventArgs 为在任何应用程序域中不处理异常时引发的事件提供数据。
// *
// */
// AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
Message("Event handler starting"); Delay(4000);
};
// /* 当一个系统 表示处理没有事件数据的事件的方法。*/
// //AppDomain.CurrentDomain.DomainUnload += (s,e) =>
{ Message("Event handler starting"); Delay(1111); };
// // var tt = AppDomain.MonitoringIsEnabled.ToString();
//获取或设置一个值,该值指示是否对应用程序的CPU和内存进行监视为当前进程启用域,
//一旦为流程启用了监视,就不能禁用它。若启用监察,则为true;
// Thread thread = new Thread(() => { Message("Throwing exception.");
throw new Exception();});
// thread.Start();//启动
// Delay(2000);
// //Console.WriteLine("好似天上的星,沉淀在水底的梦。再加上 {0}", tt);
// }
// finally//始终返回这个内容
// {
// Message("Finally block running.");
// }
// }
// static void Delay(int i)
// {
// Message($"Sleeping for {i} ms");
// Thread.Sleep(i);//挂起线程
// Message("Awake");
// }
// static void Message(string text)
// {
// Console.WriteLine("{0}:{1:0000}:{2}", Thread.CurrentThread.ManagedThreadId,
clock.ElapsedMilliseconds, text);
// //由于使用了线程,所以结果顺序可能会不一样,但结果始终是一样的,类似一 Thread.for() 那个例子
// }
//}
#endregion
#region CancellationTokenSource
// https://www.cnblogs.com/lori/p/7483960.html
//http://www.codefans.net/articles/1687.shtml
//public static void Main()
//{
// using (var cts = new CancellationTokenSource()) // CancellationTokenSource 时候触发类。
// {
// CancellationToken token = cts.Token;// CancellationToken 传播应取消操作的通知。
// ThreadPool.QueueUserWorkItem(_ => Asyncoperation1(token));//看一下能用到谁
// Thread.Sleep(TimeSpan.FromSeconds(1));//万金油角色,计时器供应商
// cts.Cancel();//取消请求
// token.Register(Asyncoperation5);//登记调用一个方法
// }
// using (var cts = new CancellationTokenSource())
// {
// CancellationToken token = cts.Token;
// ThreadPool.QueueUserWorkItem(_ => Asyncoperation2(token));
// Thread.Sleep(TimeSpan.FromSeconds(2));
// }
// using (var cts = new CancellationTokenSource())
// {
// CancellationToken token = cts.Token;
// ThreadPool.QueueUserWorkItem(_ => Asyncoperation3(token));
// Thread.Sleep(TimeSpan.FromSeconds(2));
// }
// using (var cts = new CancellationTokenSource())
// {
// CancellationToken token = cts.Token;
// ThreadPool.QueueUserWorkItem(_ => Asyncoperation4(token));
// Thread.Sleep(TimeSpan.FromSeconds(2));
// }
// Thread.Sleep(TimeSpan.FromSeconds(2));
// Console.ReadKey();
//}
//static void Asyncoperation1(CancellationToken token)
//{
// Console.WriteLine("第一个");
// for (int i = 0; i < 5; i++)
// {
// if (token.IsCancellationRequested)//盘对任务是否取消 如果任务被取消,就是true
// {
// Console.WriteLine("取消第一个");
// return;
// }
// Thread.Sleep(TimeSpan.FromSeconds(1));//相当于一个计时器
// }
// Console.WriteLine("第一项任务完成,估计用不上");
//}
//static void Asyncoperation2(CancellationToken token)
//{
// try
// {
// Console.WriteLine("第二");
// for (int i = 0; i < 5; i++)
// {
// token.ThrowIfCancellationRequested();
// Thread.Sleep(TimeSpan.FromSeconds(1));
// }
// Console.WriteLine("取消第二个任务");
// }
// catch (Exception)
// {
// Console.WriteLine("取消第二个任务,完成");
// }
//}
//static void Asyncoperation3(CancellationToken token)
//{
// bool cancellationFlag = false;
// token.Register(() => cancellationFlag = true);
// Console.WriteLine("第三");
// for (int i = 0; i < 5; i++)
// {
// if (cancellationFlag)
// {
// Console.WriteLine("取消第三个");
// return;
// }
// Thread.Sleep(TimeSpan.FromSeconds(1));
// }
// Console.WriteLine("第三个已经取消");
//}
//static void Asyncoperation4(CancellationToken token)
//{
// CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
// int i = 0;
// Console.WriteLine("第四个");
// while (!token.IsCancellationRequested)
// {
// Console.WriteLine(DateTime.Now); //输出当前时间
// Thread.Sleep(3000);
// Console.WriteLine("结束了");
// Console.ReadLine();//现在这个状态是把线程挂起了呢?还是把线程杀死了呢?嗯,等待键入然后线程继续?
// }
//}
//static void Asyncoperation5()
//{
// Console.WriteLine("被登记调用的方法");
//}
#endregion
//}