zoukankan      html  css  js  c++  java
  • 多线程之取消架构

      .NET 4.5 中包含取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。但目前,并不是所有阻塞调用都实现了这个新技术。已经实现了这种机制的技术有任务(http://www.cnblogs.com/afei-24/p/6907840.html),并发集合类(http://www.cnblogs.com/afei-24/p/6836976.html),并行LINQ(http://www.cnblogs.com/afei-24/p/6860753.html)和几种同步机制。
      取消架构基于协作行为,它不是强制的。长时间运行的任务会检查它是否被取消,并返回控制权。
      支持取消的方法接受一个CancellationToken参数。这个类定义了IsCancellationRequested属性,其中长时间运行的操作可以检查它是否应终止。使用Register()方法注册一个将在取消此 System.Threading.CancellationToken 时调用的委托。它在调用Cancel()方法取消操作时调用。

    1.Parallel.For()方法的取消
      Parallel类提供了For()方法的重载版本,在重载版本中,可以传递ParallelOptions类型的参数。使用ParallelOptions类型,可以传递一个CancellationToken参数。CancellationToken参数通过创建CancellationTokenSource来生成。由于CancellationTokenSource实现了ICancelableOperation接口,因此可以用CancellationToken注册,并允许使用Cancle(),CancleAfter()等方法取消操作。
      示例:

        static void CancelParallelFor()
            {
                var cts = new CancellationTokenSource();
                cts.Token.Register( ()=> Console.WriteLine("token canceled!"));
    
                cts.CancelAfter(1000);
    
                try
                {
                    ParallelLoopResult plr =
                        Parallel.For(0, 100, new ParallelOptions { CancellationToken = cts.Token },
                        x => {
                            Console.WriteLine("loop {0} started", x);
                            Thread.Sleep(1000);
                            Console.WriteLine("loop {0} fininshed!", x);
                        });
                }
                catch (OperationCanceledException ex)
                {
                    Console.WriteLine(ex.Message);
    
                }
            }

      输出:
      

      在For循环的实现代码中,Parallel类验证CancellationToken的结果,并取消操作。一旦取消操作,For()方法就抛出一个OperationCanceledException类型的异常。
      由输出可看出,当取消操作时,已启动的操作允许完成,因为取消操作总是以协作方式进行,以避免在取消迭代操作的中间泄露资源。

    2.任务的取消
      任务的取消类似Parallel.For()方法的取消。首先,创建一个CancellationTokenSource。如果只需要一个取消标记,可以访问Task.Factory.CancellationToken,以使用默认的取消标记。任务通过TaskFactory对象接受取消标记。在构造函数中,把取消标记赋予TaskFactory。这个取消标记又任务用于检查CancellationToken的IsCancellationRequested属性,以确定是否请求了取消。
      示例:

        static void CancelTask()
            {
                var cts = new CancellationTokenSource();
    
                cts.Token.Register(() => Console.WriteLine("task cancelled!"));
    
                cts.CancelAfter(2000);
                
    
    
                try
                {
                    Task t = Task.Run(() =>
                    {
                        CancellationToken token = cts.Token;
                        Console.WriteLine("task stared!");
                        for (int i = 0; i < 20; i++)
                        {
                            Thread.Sleep(500);
                            if (cts.IsCancellationRequested)
                            {
                                Console.WriteLine("cancelled!");
                                token.ThrowIfCancellationRequested();//抛出异常
                                break;
                            }
                            Console.WriteLine("in loop!");
                        }
                    }, cts.Token);
                    t.Wait();
                }
                catch (AggregateException ex)
                {
                    Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
                    foreach (var innerEx in ex.InnerExceptions)
                    {
                        Console.WriteLine("exception:{0},{1}", ex.InnerException.GetType().Name, ex.InnerException.Message);
                    }
                }
            }

      输出:
      

  • 相关阅读:
    PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第一讲,除数是2的幂
    PC逆向之代码还原技术,第五讲汇编中乘法的代码还原
    PC逆向之代码还原技术,第四讲汇编中减法的代码还原
    【Android】20.2 视频播放
    【Android】20.1 音频播放
    【Android】20.0 第20章 音频、视频、拍照、语音合成
    【Android】常见问题解答
    【Android】19.3 ContentProvider及安卓进一步封装后的相关类
    【Android】19.2 ShareActionProvider类—帮你把信息分享出去
    【Android】19.1 SharedPreferences类
  • 原文地址:https://www.cnblogs.com/afei-24/p/6917767.html
Copyright © 2011-2022 走看看