Task的在主线程处理异常信息的Helper类
最近使用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类的更多相关文章
- Java线程和多线程(四)——主线程中的异常
作为Java的开发者,在运行程序的时候会碰到主线程抛异常的情况.如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行 ...
- Android4.0 以后不允许在主线程进行网络连接
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException.因此,必须另起一个线程进行网络连接方面的操作. pac ...
- 在Qt中将函数发送到主线程执行
考虑这样一种需求,使用Qt的线程类QThread在后台执行操作(比如说拷贝文件)的时候发生了错误,产生了一个错误信息需要提醒给用户,在后台输出很显然是不够的,因为用户可能根据就没有任何控制台可供程序输 ...
- [Java][Android] 多线程同步-主线程等待全部子线程完毕案例
有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...
- .Net主线程扑捉子线程中的异常
首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 ); } public void run() { ...
- 关于android主线程异常NetworkOnMainThread不能訪问网络
今天在学习的过程中遇到了NetworkOnMainThread的异常,关于这个异常问题在android sdk 4.0版本号上,这个问题可能比較常见,查了许些资料大多都是大概解说原因,可是没有解说到详 ...
- Android主线程不能访问网络异常解决办法
从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...
- 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)
今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那 ...
- 19 Handler 子线程向主线程发送信息
案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...
随机推荐
- Http数据协商
一.定义: 客户端发送给服务端请求的时候,声明拿到的数据格式以及相关的限制.服务端根据请求做出判断,返回相应的数据. 二.分类 1.请求 Accept : 想要的的数据类型 Accept-Encodi ...
- HanLP 自然语言处理 for nodejs
HanLP 自然语言处理 for nodejs ·支持中文分词(N-最短路分词.CRF分词.索引分词.用户自定义词典.词性标注),命名实体识别(中国人名.音译人名.日本人名.地名.实体机构名识别),关 ...
- 【java】package
总结: 包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰. 不同包中的子类还可以直接访问父类中被protected权限修饰的成员. 包与包之间可以使用的权限只有两种,publi ...
- 【转】Syncthing的安装与使用
Syncthing的安装与使用 无论办公.文件共享.团队协作还是家庭照片.视频.音乐.高清电影的存储,我们常常都有文件同步和存储的需求.但随着国内各大网盘的花式阵亡或限速,早已没什么好选择了. 除了转 ...
- 存储专栏:一句话说清RAID2.0
今天,西瓜哥来谈谈高端存储的一股势力,RAID 2.0,最近被华为HVS搞得风生水起,神奇的让人摸不着头脑.我还是从一个高端存储的江湖说起吧. 据说很久很久以前(别扔臭鸡蛋,讲故事都是这样的…),L ...
- Ubuntu 15.10 下Redis Cluster使用
1 Redis Standalone安装 可以参考这篇博文:http://www.cnblogs.com/_popc/p/3684835.html 2 Redis Cluster安装 2.1 环境介绍 ...
- java.util.concurrent包下集合类的特点与适用场景
java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞 ...
- mvcmovie sample 在window10 下的部署问题(HTTP Error 500.19 - Internal Server Error)
mvcmovie sample 在window10 下的部署问题 使用VS2018配置好了mvcmovie sample,发布到IIS后,打开报错: HTTP Error 500.19 - Inter ...
- ubuntu环境部署项目
安装python3.6 第一步:sudo add-apt-repository ppa:jonathonf/python-3.6 如果报错为:sudo: add-apt-repository: com ...
- DLC 基本逻辑运算
逻辑代数:分析设计数字电路的数学基础是逻辑代数 变量的取值只能是 0 1 逻辑代数中只有三种基本逻辑运算,即 与 或 非 与逻辑运算: 只有决定一件事情的全部条件都具备时,这事件才成立.这样的因果关系 ...