我们的应用程序有很多对 Task.Factory.StartNew(Action 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; }
}
这就是我难过的地方。首先,我如何获得父 CultureInfo?其次如何将异常返回给调用线程?以及如何在通话中使用此类?即如何替换现有的 Task.Factory.StartNew(..)
我正在使用 Unity,但我在这里不熟悉的领域。任何帮助或指导将不胜感激,或者是否有更好的解决方案?也许我从错误的脚开始?
我正在使用 .NET 4.5
我在下面得到的大多数反馈似乎都避开了拦截器路线。假设使用拦截器是错误的方法是否安全?如果有人可以指导我朝那个方向发展,那将允许我进行比较。如果问题的答案是肯定的,我想知道如何?