Перед использованием параллельной библиотеки задач я часто использовал CorrelationManager.ActivityId для отслеживания отчетов трассировки/ошибок с несколькими потоками.
ActivityId хранится в локальном хранилище потоков, поэтому каждый поток получает свою собственную копию. Идея заключается в том, что при запуске потока (активности) вы назначаете новый ActivityId. ActivityId будет записываться в журналы с любой другой информацией о трассировке, позволяя выделить информацию о трассировке для одного "Активность". Это действительно полезно с WCF, поскольку ActivityId может переноситься на компонент службы.
Вот пример того, что я говорю:
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
{
DoWork();
}));
}
static void DoWork()
{
try
{
Trace.CorrelationManager.ActivityId = Guid.NewGuid();
//The functions below contain tracing which logs the ActivityID.
CallFunction1();
CallFunction2();
CallFunction3();
}
catch (Exception ex)
{
Trace.Write(Trace.CorrelationManager.ActivityId + " " + ex.ToString());
}
}
Теперь, с помощью TPL, я понимаю, что несколько задач разделяют потоки. Означает ли это, что ActivityId подвержен повторной инициализации средней задачи (по другой задаче)? Есть ли новый механизм для отслеживания активности?