搞winform界面的时候,很多地方用异步处理,又懒得个个写catch,所有弄这个来用用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MethodExtension
{
public static class Method
{
/// <summary>
/// 捕捉线程内部异常并抛回主线程,多参数委托
/// </summary>
/// <param name="task"></param>
/// <param name="action"></param>
/// <param name="param"></param>
/// <returns></returns>
public static Task StartNew(this TaskFactory task, Action<object[]> action, params object[] param)
{
var t = task.StartNew((sc) =>
{
try
{
action.Invoke(param);
}
catch (Exception ex)
{
((SynchronizationContext)sc).Post((p) =>
{
throw (Exception)p;
}, ex);
}
}, SynchronizationContext.Current);
return t;
}
}
}
使用
Task.Factory.StartNew((p) =>
{
var temp = _dal.GetSendTriger(Setting.SelectSort);
dataGridView1.BeginInvoke((Action)(() =>
{
label8.Text = "共" + temp.Rows.Count + "条记录";
dataGridView1.DataSource = temp;
}));
});
Task.Factory.StartNew((p) =>
{
var a=p[0];
var b=p[1];
},"参数1",1);
Task.Factory.StartNew((p) =>
{
var b=p[0];
},"a");
全局捕捉
//方式1
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
MessageBox.Show(e.ExceptionObject.ToString(), "提示");
};
//方式2
Application.ThreadException += (sender, e) =>
{
MessageBox.Show(e.Exception.Message, "提示");
};
-----------------------------------------2021年3月27日00:59:11---------------------------------------------
注意…
在非UI线程里SynchronizationContext.Current可能会为null,所以改为直接重新实例一个SynchronizationContext,并且异常以字符串形式抛出,异常可以更加详细
public static class TaskEx
{
/// <summary>
/// 捕捉线程内部异常并抛回主线程,多参数委托
/// </summary>
/// <param name="task"></param>
/// <param name="action"></param>
/// <param name="param"></param>
/// <returns></returns>
public static Task StartNewEx(this TaskFactory task, Action<object[]> action, params object[] param)
{
var t = task.StartNew((sc) =>
{
try
{
action.Invoke(param);
}
catch (Exception ex)
{
((SynchronizationContext)sc).Post((p) =>
{
throw new Exception(((Exception)p).ToString());
}, ex);
}
}, new SynchronizationContext());
return t;
}
/// <summary>
/// 捕捉线程内部异常并抛回主线程
/// </summary>
/// <param name="task"></param>
/// <param name="action"></param>
/// <returns></returns>
public static Task RunEx(this TaskFactory task, Action action)
{
SynchronizationContext context = new SynchronizationContext();
var t = Task.Run(() =>
{
try
{
action.Invoke();
}
catch (Exception ex)
{
context.Post((p) =>
{
throw new Exception(((Exception)p).ToString());
}, ex);
}
});
return t;
}
}