TPL异步并行编程之回调

Posted bing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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频繁的系统来说。

 

以上是关于TPL异步并行编程之回调的主要内容,如果未能解决你的问题,请参考以下文章

并发编程基础

并行编程(Future)

TPL 数据流是并行的或有序的,但不是两者

理解并行编程

精通C#---多线程,并行,异步编程

浅谈.Net异步编程的前世今生----异步函数篇(完结)