Любая помощь с этим очень ценится ...
У меня есть приложение WPF, и я пытаюсь использовать возможность ведения журнала Enterprise Library (v5) для записи определенных событий. В приложении есть все .Net 4.0.
У меня есть несколько длительных процессов, и я использую Task Parallel Library для многопоточности, где это необходимо. Я использую синтаксис Task.Factory.StartNew и имею несколько продолжений для управления потоком.
Цепочка событий заканчивается вызовом метода, который я запускаю в потоке пользовательского интерфейса, что позволяет мне обновлять различные компоненты пользовательского интерфейса и тому подобное. С помощью этого метода я также пытаюсь записать в свой журнал ... и приложение просто зависает.
Подведем итог:
1) У меня есть статический класс 'logging', который позволяет мне разрешить экземпляр Logger обычным методом:
public static void LogThis(string message)
{
LogWriter logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
logWriter.Write(message, "My Default Logging Category");
}
2) У меня есть вызов Task Factory, который запускает мою долгую работу:
...
var longProcess = Task.Factory.StartNew(() => ThisMethodTakesAWhile(variable));
...
3) Это задание завершается с помощью продолжения вызовом моего метода «обернуть вещи»:
...
// longProcess is the task coming out of the Factory call in point 2.
// We use the Current Sync Context to allow us to come back to the UI thread.
longProcess.ContinueWith(ant => WrapThingsUp(ant.Result), CancellationToken.None, TaskContinuationOptions.NotOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());
...
4) Мой метод «обернуть вещи» пытается зайти в систему:
private void WrapThingsUp(string resultOfLongProcess)
{
//This call locks the applicaiton.
LogThis("Just to let you know I've finished that long task");
// I never get here!
}
My Logging настроен на целевой плоский файл в локальной папке. Любые вызовы из потока пользовательского интерфейса работают без проблем. Кажется, это ТОЛЬКО звонки из TPL, которые блокируют.
Я читал статьи о невозможности одновременной записи в один файл из нескольких источников (что я не пытаюсь сделать, в пункте 4 выше я проверяю, что больше ничего не пытается войти).
Я также видел статью здесь о безопасности потоков, и мне интересно, связано ли это.
РЕДАКТИРОВАТЬ: Я также попытался вызвать запись журнала явно, как обсуждалось здесь , что пингуется в статье StackOverflow здесь .
РЕДАКТИРОВАТЬ: Я убежден, что это связано с пользовательским интерфейсом / диспетчера, так как щелчок правой кнопкой мыши на элементе панели задач приложения "пробуждает" его.
Если я могу добавить больше деталей, пожалуйста, дайте мне знать.