Регистрация в корпоративной библиотеке и параллельная библиотека задач - запись в журнал из отдельного потока? - PullRequest
0 голосов
/ 19 сентября 2011

Любая помощь с этим очень ценится ...

У меня есть приложение 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 здесь .

РЕДАКТИРОВАТЬ: Я убежден, что это связано с пользовательским интерфейсом / диспетчера, так как щелчок правой кнопкой мыши на элементе панели задач приложения "пробуждает" его.

Если я могу добавить больше деталей, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 12 марта 2012

Прежде всего, используйте статический конструктор для инициализации вашего статического регистратора и используйте статическое поле для связи с ним. вы постоянно тратите много времени на использование фабрики (она проверяет файл конфигурации каждый раз, когда вы что-то регистрируете).

как говорится,

Я создал простой пример TPL, который просто спит в течение случайного количества времени (между 8 и 10 минутами), прежде чем вернуться в пользовательский интерфейс, он отправляет обновления через AsyncOperationManager в пользовательский интерфейс, и все работает.

Я не могу повторить вашу проблему. Вы можете уточнить подробнее?

с использованием EL 5.0

...