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