Я использую NLog 4.3.5 и рамки .Net 4.6.1NLog MappedDiagnosticsLogicalContext не работает в асинхронном/ждут с ConfigureAwait (ложной)
Когда я начинаю работу на стороне сервера, который я называю:
NLog.MappedDiagnosticsLogicalContext.Set("OperationId", Guid.NewGuid());
Это отображается и отображается в моих файлах журнала. Все хорошо .... или не так ли? При просмотре моих файлов журналов я заметил, что это значение идентификатора операции не работает, как я ожидал.
Пример:
В потоке 19 операция начинается и устанавливает контекст.
Он использует .ConfigureAwait (ложь) на все ждут звонков
Он выполняет
var tasks = items.Select(item => Task.Run(() => { /* do stuff */} await Task.WhenAll(tasks).ConfigureAwait(false)
- Один из потоков, используемых для выполнения этих задач является поточно 31 (имейте это в виду, для последующего использования)
- Между тем, в потоке 36 вызывается другой серверный метод и начинается новая операция. Несколько сообщений журнала написаны с уникальным идентификатором операции
- Эта операция выполняет 2 разных вызова ожидания с помощью ConfigureAwait (false)
- Следующий оператор журнала встречается в потоке 31. С этого момента он регистрирует идентификатор операции, который был создан для операция, которая началась в потоке 19!
Я не ожидал, что это произойдет, и я не знаю, как это произошло. Но, просматривая историю журнала, я вижу, что такого рода вещи случались раньше.
Я думал, что контекст логического вызова должен был переноситься. Могу ли я использовать ConfigureAwait (false), который вызывает такое поведение? Это единственное, что я могу придумать ....
Да, это решение было в ссылке, которую я написал выше. – Keith
Отчасти это связано со ссылкой. Я обновил и расширил ваши требования. – Julian