Ray*_*Ray 10 c# multithreading unity-container interception
我们的应用程序有很多对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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但后来我意识到更好的方法是拦截器.我想拦截对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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我难倒的地方.首先,我如何获得父文化信息?其次如何将异常返回给调用线程?以及如何在通话中使用此课程?即我如何替换现有的Task.Factory.StartNew(..)
我正在使用Unity,我在这里处于一个不熟悉的领域.任何帮助或指导将不胜感激,或甚至有更好的解决方案?也许我开始走错了路?
我正在使用.NET 4.5
我得到的大部分反馈似乎都避免了拦截器路线.假设使用拦截器是错误的方法是否安全?如果有人可以指导我朝这个方向发展,那么我可以做一个比较.如果问题的答案是肯定的,我想知道怎么做?
我建议您不要在每个任务中设置区域性,而是设置CultureInfo.DefaultThreadCurrentCulture和CultureInfo.DefaultThreadCurrentUICulture属性来为所有未来线程全局设置区域性。
关于错误处理,在 try/catch 块中使用可能await比传递委托来处理异常更容易:
try
{
// Task.Run is similar to Task.Factory.StartNew, but easier to use
await Task.Run(...);
}
catch(Exception ex)
{
// handle it...
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您同时运行多个任务,则当前的错误处理机制将不起作用,因为_exceptionCallback所有任务只有一个......
| 归档时间: |
|
| 查看次数: |
586 次 |
| 最近记录: |