zoukankan      html  css  js  c++  java
  • TPL异步并行编程之回调

    Task是基于ThreadPool线程池基础上的高度异步多线程编程,如果有一天我希望一个需要长时间运行的Task,在被某些异常终止后还能回调一些代码就可以知道Task终止的原因了吧

    是的,且看代码

    public static Task AsyncRun(this ILoggerProvider logProvider, Action task, TaskCreationOptions taskOption, Action<Exception> exceptionHandler)
    {
      return Task.Factory.StartNew(task, taskOption).ContinueWith(t =>
      {
        if (exceptionHandler != null)
          exceptionHandler(t.Exception);
        else
        {
          if (logProvider.Logger.IsErrorEnabled)
          {
            for (var i = 0; i < t.Exception.InnerExceptions.Count; i++)
            {
              logProvider.Logger.Error(t.Exception.InnerExceptions[i]);
            }
          }
        }
      }, TaskContinuationOptions.OnlyOnFaulted);
    }

    Task.Factory.StartNew(()=>{

      while(true){

        //一个持续工作的线程

      }

    }).ContinueWith(t=>{

      //我是这个线程的尾巴,因为线程由于某些原因被终止后会调用我,在这里我可以处理异常,以及其他事情

      //比如异常

      var exception=t.Exception;//此时我可以向外界或者日志输出异常终止的原因了

    })

    同时你还可以通过TaskContinuationOptions设置线程什么情况下才回调代码

    所以Task这个东西的确很方便,且很高效,对于像服务器多线程编程而言是非常有用的,而不是传统的直接new一个线程,让线程一直保持运行,那么服务器的线程将会达到一个非常高的值,反而降低进程性能,因为线程也会有不少的资源开销,特别是对于io频繁的系统来说。

  • 相关阅读:
    Java使用AES算法
    Python中使用AES算法(解决Python2.x和3.x下运行不兼容问题)
    关于递归
    zabbix文档3.4
    CentOS-7.3.1611编译安装 Nginx-1.12.1+mysql-5.7.19+PHP-7.1.8+zabbix-3.4.1
    搭建zabbix服务器监控
    php编译安装过程中遇到问题
    springboot 获取控制器参数的几种方式
    spring boot 全局异常处理及自定义异常类
    Java 中的异常和处理详解
  • 原文地址:https://www.cnblogs.com/rjjs/p/5607156.html
Copyright © 2011-2022 走看看