c# – 我可以拦截Task.Factory.StartNew吗?

我们的应用程序有很多调用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 …

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


c语言数组越界会怎么样
c语言指针怎么等于数组
c语言数组怎么存入文字
c语言中怎么显示数组
c语言数组元素怎么选
c语言数组怎么累加
c语言数组符号怎么输入
c语言怎么用长数组
c语言数组函数怎么输入
c语言数组怎么去掉差异
c语言怎么求解数组
c语言数组怎么用变量
c语言怎么申明数组
c语言怎么控制数组
c语言怎么计算数组长度
c语言数组怎么插星号
c语言数组怎么加长度
c语言中怎么输出数组
c语言怎么记住数组边界
c语言数组怎么输入符号