Идентификатор действия EventSource и TPL

Согласно документации http://msdn.microsoft.com/en-us/library/dn775009%28v=pandp.20%29.aspx идентификатор текущего действия должен обрабатываться TPL. Но когда я получаю результаты, события журнала из разных задач относятся к разным действиям. Для чтения сообщений я использую вне процесса SemanticLogging-svc.2.0.1406.1 Рабочий процесс следующий:
1. Я задаю идентификатор активности, который будет использоваться. EventSource.SetCurrentThreadActivityId.
2. Затем у меня есть некоторый код в одном потоке, но также может быть много кода в разных потоках. Пример (сообщения журнала из следующих задач регистрируются как разные идентификаторы действий):

Events.Current.TestMethod3();
Task.WaitAll(Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 10; i++)
    {
        Events.Current.TestMethod1_Sleep(50);
        System.Threading.Thread.Sleep(50);
        Events.Current.TestMethod2_Continue();
    }
}),
Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 10; i++)
    {
        Events.Current.TestMethod1_Sleep(60);
        System.Threading.Thread.Sleep(60);
        Events.Current.TestMethod2_Continue();
    }
}));
Events.Current.TestMethod3();

Любые идеи, как это решить? Может быть, я должен сделать специальные вещи, чтобы решить эту проблему?


person Darius    schedule 23.12.2014    source источник
comment
@Darius TPL опубликует события передачи, которые связывают корневой идентификатор действия с идентификаторами действия задач. Он не будет устанавливать идентификатор действия каждой задачи в идентификатор действия корневого потока. Очень, очень нелогичное поведение   -  person Panagiotis Kanavos    schedule 23.12.2014
comment
Возможно ли иметь одинаковый идентификатор активности для всех сообщений журнала? В коде у меня много мест, где используется TPL, и я хочу как-то решить проблему в одном месте, если это возможно? Потому что какой смысл публиковать события переноса, когда невозможно увидеть, что они связаны в логе.   -  person Darius    schedule 23.12.2014


Ответы (1)


Чтобы это заработало, вам необходимо включить источник событий TPL, как описано здесь.

Если вы используете прослушиватели вне процесса, то существует ошибка, из-за которой невозможно включить TPL. по имени — вместо этого необходимо использовать GUID TPL EventSource.

person Darius    schedule 23.12.2014