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 ...
随机推荐
- 一位工作8年的java软件工程师该如何发展
从08年到现在已工作8年多了,但是对职业生涯的规划还没有很清晰的定义,可能之前做的工作太杂太广,回想第一家公司从事了6年有得也有失,虽然涉及到开发.设计.管理等岗位,但从技术上总结并没有很擅长的技术, ...
- [总结] Synchronized汇总
Java中的每一个对象都可以作为锁. 1对于同步方法,锁是当前实例对象. 2对于静态同步方法,锁是当前对象的Class对象. 3对于同步方法块,锁是Synchonized括号里配置的对象. 当一个线程 ...
- 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址
在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...
- [蓝桥杯]PREV-26.历届试题_最大子阵
问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和 ...
- nginx1.14.0版本高可用——keepalived双机热备
nginx不支持主从,所以我们需要使用keepalive支持高可用. keepalived重要知识点 在局域网内,每个主机上各安装一个keepalived,注意关闭防火墙firewalld,然后设定一 ...
- struct2depth 记录
把效果图放在前面 03.28 handle_motion False architecture simple joint_encoder False depth_normalization ...
- python笔记(三)---文件读写、修改文件内容、处理json、函数
文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...
- windows 下借助7zip实现命令行解压缩
windows 下借助7zip实现命令行解压缩 64位电脑下载 https://www.7-zip.org/a/7z1805-x64.exe 安装 安装目录下所有文件如下: 在命令行下只需要用到 7z ...
- ES6系列之解构
本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...
- Access denied when I try to install profiler
I had the same issue and used the diagtool to find more information. The traces showed this error me ...