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 ...
随机推荐
- Linux csplit命令详解
Linux csplit命令 Linux csplit命令用于分割文件.拆解文件主要是split和csplit命令,如果说split是按大小来拆分的话,那么csplit则可按匹配来拆分: 将文件依照指 ...
- 【转】linux scp远程拷贝文件及文件夹
转自:http://www.jb51.net/LINUXjishu/73131.html 1.拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/r ...
- vs2015 无法连接到已配置的开发web服务器
问题一:vs2015 无法连接到已配置的开发web服务器 最靠谱方法如下:(和防火墙开启无关联, 注册表增加什么键值无关联 , 缺失asp.net core.Dll文件无关联 ) 分析,因为前提是你的 ...
- verilog中24LC04B iic(i2c)读写通信设计步骤,以及程序常见写法错误。
板子使用的是黑金的是xilinx spartan-6开发板,首先准备一份24LC04B芯片资料,读懂资料后列出关键参数. 如下: 1.空闲状态为SDA和SCL都为高电平 2.开始状态为:保持SCL,S ...
- 工控随笔_09_西门子_S7-200 Smart与V20 USS通信USS_RPM_R利用轮询的方式通讯异常
前两天处理过一个故障,是S7-200 Smart与V20的USS通讯,设备厂家在程序里面利 用USS_RPM _R程序循环轮询5个V20设备读取频率和电流值等信息. 图 USS_RPM_R读取信息 上 ...
- awk命令基本使用方法
awk命令 基本用法 awk '{print $1, $4}' netstat.txt 单引号中大括号的部分就是awk语句 $1至$n表示第几列,$0表示整行 格式化输出的方法 $ awk '{pri ...
- 删除DataTable的指定行(Lambda)
DataTable dtTcu = GetAllTcuInfoBySdId(sdId); DataTable dtToesm = GetAllToesmBySdId(sdId); foreach (D ...
- centos7安装rabbitmq3.7.9
感谢此兄: https://blog.51cto.com/huwei555/2341513?source=dra (centos7 安装rabbitmq 3.7) 以root用户登录.cd /hom ...
- 前端使用nginx 达到前后分离的开发目的
前言: 由于现在要开发一套基于python 的日志分析系统,设计到日志收集,分析,可视化输出,所以我使用前后端分离的做法.记录学习的过程: 00x1: 下载配置nginx:在E盘创建Service 目 ...
- 新手必备|常见30种NLP任务的练手项目(文末福利)
1.分词 Word Segmentationchqiwang/convseg ,基于CNN做中文分词,提供数据和代码. 2.词预测 Word PredictionKyubyong/word_predi ...