最近使用task时候需要把异常记录日志,直接注入非单例模式的实例进入异步线程,在高并发情况下会出现一些问题。

所以需要把异常反馈给主线程 ,并且不在主线程里进行等待,研究相关资料后,自己写了一个简单的helper类封装了下。

 using System;
using System.Threading;
using System.Threading.Tasks; namespace Xyfy.Helper
{
/// <summary>
///
/// </summary>
public class TaskHelper
{
/// <summary>
///
/// </summary>
event EventHandler<AggregateExceptionArgs> AggregateExceptionCatched; private readonly TaskFactory factory; private readonly Action<Exception> logAction; /// <summary>
///
/// </summary>
/// <param name="errorLogAction"></param>
public TaskHelper(Action<Exception> errorLogAction = null)
{
logAction = errorLogAction ?? Console.WriteLine;
AggregateExceptionCatched += new EventHandler<AggregateExceptionArgs>(Program_AggregateExceptionCatched);
factory = Task.Factory;
} /// <summary>
///
/// </summary>
/// <param name="workAction"></param>
/// <returns></returns>
public Task StartNew(Action workAction)
{
return ContinueWith(factory.StartNew(workAction));
}
/// <summary>
///
/// </summary>
/// <param name="task"></param>
/// <returns></returns>
private Task ContinueWith(Task task)
{
return task.ContinueWith(t =>
{
if (t.Exception != null)
{
AggregateExceptionArgs errArgs = new AggregateExceptionArgs()
{
AggregateException = new AggregateException(t.Exception.InnerExceptions)
};
AggregateExceptionCatched(null, errArgs);
}
}, TaskContinuationOptions.OnlyOnFaulted);
}
/// <summary>
///
/// </summary>
/// <param name="action"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StartNew(Action action, CancellationToken cancellationToken)
{
return ContinueWith(factory.StartNew(action, cancellationToken));
}
/// <summary>
///
/// </summary>
/// <param name="action"></param>
/// <param name="creationOptions"></param>
/// <returns></returns>
public Task StartNew(Action action, TaskCreationOptions creationOptions)
{
return ContinueWith(factory.StartNew(action, creationOptions));
}
/// <summary>
///
/// </summary>
/// <param name="action"></param>
/// <param name="cancellationToken"></param>
/// <param name="creationOptions"></param>
/// <param name="scheduler"></param>
/// <returns></returns>
public Task StartNew(Action action, CancellationToken cancellationToken,
TaskCreationOptions creationOptions, TaskScheduler scheduler)
{
return ContinueWith(factory.StartNew(action, cancellationToken, creationOptions, scheduler));
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Program_AggregateExceptionCatched(object sender, AggregateExceptionArgs e)
{
foreach (Exception item in e.AggregateException.InnerExceptions)
{
logAction(item);
}
} }
}
 using System;
using System.Threading;
using System.Threading.Tasks; namespace Xyfy.Helper
{
/// <summary>
///
/// </summary>
public class AggregateExceptionArgs : EventArgs
{
/// <summary>
///
/// </summary>
public AggregateException AggregateException { get; set; }
}
}

Task的在主线程处理异常信息的Helper类的更多相关文章

  1. Java线程和多线程(四)——主线程中的异常

    作为Java的开发者,在运行程序的时候会碰到主线程抛异常的情况.如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行 ...

  2. Android4.0 以后不允许在主线程进行网络连接

    Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException.因此,必须另起一个线程进行网络连接方面的操作. pac ...

  3. 在Qt中将函数发送到主线程执行

    考虑这样一种需求,使用Qt的线程类QThread在后台执行操作(比如说拷贝文件)的时候发生了错误,产生了一个错误信息需要提醒给用户,在后台输出很显然是不够的,因为用户可能根据就没有任何控制台可供程序输 ...

  4. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  5. .Net主线程扑捉子线程中的异常

    首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 );        }        public void run()        {   ...

  6. 关于android主线程异常NetworkOnMainThread不能訪问网络

    今天在学习的过程中遇到了NetworkOnMainThread的异常,关于这个异常问题在android sdk 4.0版本号上,这个问题可能比較常见,查了许些资料大多都是大概解说原因,可是没有解说到详 ...

  7. Android主线程不能访问网络异常解决办法

    从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...

  8. 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)

    今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那 ...

  9. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...

随机推荐

  1. java前台线程和后台线程

     main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面.                 ...

  2. OTB数据库上各tracker评测结果

    后面两张success plot分别是按照threshold和auc排序 各tracker说明: Year2015: [CF2] 实验结果比论文中的结果好,原因是我运行的是作者后期又更新过的代码,作者 ...

  3. 信号监测---verilog

    信号监测---verilog 此模块用于监测某一信号源是否持续稳定的传送. 监测思路:监测信号源高电平或者低电平的宽度是否始终保持一致(一定范围内允许有误差) `timescale 1ns / 1ps ...

  4. QNET,一款给力的APP弱网络测试工具

    目前在测试移动设备上进行弱网络专项测试的方案主要有两种: 通过Android设备连接到PC上进行弱网络测试,比如Fiddler,Charles,NET-Simulator等.基本思路是在PC上装一个F ...

  5. centos7卸载旧jdk安装新jdk1.8

    卸载旧JDK版本 需卸载centos7自带的JDK1.7 rpm -qa|grep jdk     列出已安装jdk版本 rpm -e --nodeps java-1.7.0-openjdk-1.7. ...

  6. Kong(v1.0.2)认证

    介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...

  7. android 显示大图模糊问题

    使用Glide 版本为4.8.0 /* */ Glide.with(context).asBitmap().load(url).into(new SimpleTarget<Bitmap>( ...

  8. LeetCode【112. 路径总和】

    思路就是从根节点开始向下选节点,依次与sum比较大小,若小,则向下选左右节点其中一个,若大,则接下来判断是否是叶子节点,若是,则返回false 若不是,则上一步选另一节点,再将上述重新执行. 对于叶子 ...

  9. Specified key was too long; max key length is 767 bytes解决方案

    问题描述: 1.  使用spark sql处理数据逻辑,逻辑处理后使用 df.write.mode(saveMode).jdbc(url, tableName, connectionPropertie ...

  10. VMare Workstation 12 安装 AsteriskNow freePBX

    一.准备工作 VMware 12 安装好的电脑 AsteriskNow iso文件  官网地址 https://www.asterisk.org/downloads 本人提供相关分享:https:// ...