终止任务和取消任务

#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
  //}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值