• Parallel World 3 – Parallel Task (2)


    I. 监控Task是否取消

    1. 监控CancellationToken的IsCancellationRequested属性并抛出System.OperationCanceledException

    如果IsCancellationRequested是true, 系统需要中断task,释放它所使用的资源,同时要抛出OperationCanceledException,注意如果你在代码中不抛出这个异常,task就不会被正确设置状态;同时最好把CancellationToken做为这个异常的一个参数放到此异常中。

       1: if (token.IsCancellationRequested)
       2: {
       3:      throw new System.OperationCanceledException(token);
       4: }

    如果没有资源需要释放,可以把检查IsCancellationRequested和抛出异常合并到一起

       1: token.ThrowIfCancellationRequested();

    2. 为CancellationToken注册一个delegate, 当CancellationTokenSource.Cancel()被调用的时候,这个委托所代表的方法就会被调用

       1: token.Register(() => { Console.WriteLine("I am registered!"); });

    这点与回调方法有些类似。

    3. 调用CancellationToken.WaitHandle.WaitOne()方法

    当CancellationTokenSource.Cancel()被调用的时候,这个方法会被调用。关于WaitHandle属性,我们会在后续章节中介绍。这点与多线程中的回调方法和资源的亲源性有关。

    我们可以通过Task的IsCancelled属性来判断一个Task是否被Cancelled了

    II. 等待Task

    还记得我们在前面一节中提出的并行运行的两个基本问题吧,解决这个问题的方法就是要协调各个Task之间的执行顺序。这一节介绍的内容就是一些基本的协调Task运行的方法

    1. 等待一个Task运行完成

    task1.Wait()

    2. 等待多个Task运行完成

    Task.WaitAll(task1,task2)

    3. 等待多个Task中的任何一个运行完成

    Task.WaitAny(task1,task2)

    注意这些上述这些方法都有多个重载版本。

    III. Task异常处理

       1: try
       2: {
       3:     //tasks
       4: }
       5: catch (System.AggregateException ex)
       6: {
       7:     foreach (Exception innerEx in ex.InnerExceptions)
       8:     {
       9:         //your codes
      10:     }
      11:  
      12: }

    AggregateException是TPL为并行提供的最基本的异常. 开发人员可以使用AggregateException的属性InnerExceptions, 在try块里所有Task抛出的异常都包含在这个集合里。

    如果想要为这些异常指定自己的处理方法,开发人员可以使用AggregateException的Handle()方法

    如果开发人员在代码里没有处理异常,一旦运行过程中出现异常,.NET Framework会向上抛出异常。开发人员可以使用异常上调策略来控制这些异常,有兴趣的开发人员可以查一下资料看看。

       1: try
       2: {
       3:     //tasks
       4: }
       5: catch (System.AggregateException ex)
       6: {
       7:     ex.Handle((inner) =>
       8:     {
       9:         if (inner is OperationCanceledException)
      10:         {
      11:             return true;
      12:         }
      13:         else
      14:         {
      15:             return false;
      16:         }
      17:     });
      18: }
  • 相关阅读:
    Servlet 易错点和注意点
    Spring 完成自动注入(autowire)
    Java 定时调度Timer&Quartz
    常用Linux命令杂记
    Spring 使用AOP——基于注解配置
    Spring 使用AOP——xml配置
    Spring 使用纯注解方式完成IoC
    Spring 简单使用IoC与DI——XML配置
    让多个HTML页面 使用 同一段HTML代码
    Feture、ListenableFuture、ComplatableFuture
  • 原文地址:https://www.cnblogs.com/wildboar/p/2075220.html
Copyright © 2020-2023  润新知