c# – 我可以拦截Task.Factory.StartNew吗?
发布时间:2020-12-15 06:19:36 所属栏目:百科 来源:网络整理
导读:我们的应用程序有很多调用Task.Factory.StartNew(Action动作).不幸的是,当这样做时,文化没有设定,而且没有错误处理.我开始有一个起始阶段,既可以做到这一点: public static class TaskBuilder{ private static ActionSystem.Exception _exceptionCallback;
我们的应用程序有很多调用Task.Factory.StartNew(Action动作).不幸的是,当这样做时,文化没有设定,而且没有错误处理.我开始有一个起始阶段,既可以做到这一点:
public static class TaskBuilder { private static Action<System.Exception> _exceptionCallback; public static Task StartNew(Action action,CultureInfo cultureInfo,Action<System.Exception> exceptionCallback) { _exceptionCallback = exceptionCallback; return Task.Factory.StartNew(() => { Thread.CurrentThread.CurrentUICulture = cultureInfo; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); action.Invoke(); }).ContinueWith(t => ManageException(t.Exception),TaskContinuationOptions.OnlyOnFaulted); } private static void ManageException(System.Exception e) { if (_exceptionCallback != null) { _exceptionCallback(e); } } } 但是后来我意识到更好的方法是拦截器.我想拦截对StartNew的调用,以便新线程包含文化和错误处理代码.我的尝试产生了以下代码: public class TaskInterceptionHandler : ICallHandler { public IMethodReturn Invoke(IMethodInvocation input,GetNextHandlerDelegate getNext) { Thread.CurrentThread.CurrentUICulture = // How do I get parent cultureInfo?; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); var methodReturn = getNext().Invoke(input,getNext); if (methodReturn.Exception != null) { // How do I throw the exception to the calling thread here? } return methodReturn; } public int Order { get; set; } } 这里是我被困的地方首先,如何获得父文化信息?其次如何将异常返回给调用线程?我如何在我的电话中使用这个类?即如何替换现有的Task.Factory.StartNew(..) 我正在使用Unity,而我在这里是陌生的领域.任何帮助或指导将不胜感激,还是有更好的解决方案?也许我开始错脚了? 我使用的是.NET 4.5 我得到的大部分反馈似乎都避免了拦截器路由.假设使用拦截器是错误的方法吗?如果有人可以指导我,那可以让我做一个比较.如果问题的答案是肯定的,我想知道如何? 解决方法
我建议您设置CultureInfo.DefaultThreadCurrentCulture和CultureInfo.DefaultThreadCurrentUICulture属性,而不是在每个任务中设置文化,而不是为所有未来的线程设置文化.
关于错误处理,在try / catch块中使用等待可能更容易,而不是传递一个委托来处理异常: try { // Task.Run is similar to Task.Factory.StartNew,but easier to use await Task.Run(...); } catch(Exception ex) { // handle it... } BTW,如果您同时运行多个任务,您当前的错误处理机制将无法正常工作,因为所有任务只有一个_exceptionCallback … (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |