Как задачи в параллельной библиотеке задач влияют на ActivityID?

Перед использованием параллельной библиотеки задач я часто использовал 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 может быть повторно инициализирован в середине задачи (другой задачей)? Есть ли новый механизм для отслеживания активности?

11
задан Greg Sansom 2 December 2010 в 23:07
поделиться