Могу ли я перехватить Task.Factory.StartNew?

В нашем приложении много вызовов Task.Factory.StartNew(действие). К сожалению, при этом культура не установлена, и, кроме того, нет обработки ошибок. Я начал с класса стартера, который будет делать оба:

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

Большая часть обратной связи, которую я получаю ниже, кажется, избегает маршрута перехватчика. Можно ли предположить, что использование перехватчика - неправильный путь? Если кто-то может вести меня в этом направлении, это позволит мне сделать сравнение. Если ответ на вопрос "да", я хотел бы знать, как?

Ответ 1

Вместо того, чтобы устанавливать культуру в каждой задаче, я предлагаю вам установить свойства CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture для установки культуры по всему миру для всех будущих потоков.

Что касается обработки ошибок, возможно, проще использовать await в блоке try/catch, а не передавать делегат для обработки исключения:

try
{
    // Task.Run is similar to Task.Factory.StartNew, but easier to use
    await Task.Run(...);
}
catch(Exception ex)
{
    // handle it...
}

Кстати, ваш текущий механизм обработки ошибок не будет работать, если у вас одновременно запущено несколько задач, так как для всех задач есть только один _exceptionCallback...