2013-06-03 2 views
6

У меня есть служба WCF, и она регистрирует каждый вызов в базе данных. Позже, если возникает исключение, оно также регистрируется в отдельной базе данных.Что такое контекст потока в C#?

Мне нужен способ связать оба этих журнала вместе, чтобы мы могли видеть, что могло вызвать исключение. Для этого мне нужен какой-то уникальный идентификатор, который я мог бы получить для каждого звонка.

Поскольку все это выполняется в одном потоке, я мог бы, например, задать имя потока для GUID, например. System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString();, но это немного хаки.

Поиск по сети, я обнаружил System.Threading.Thread.CurrentContext.SetProperty(), но мне интересно, что это за контекст. Он предназначен для хранения свойств в течение всего потока? Это уникально для каждой нити?

Если у меня есть 5 одновременных вызовов WCF, я не хочу, чтобы между конфликтами между ними происходило конфликты, если это не так, как говорится.

Может ли кто-нибудь уточнить?

ответ

5

Я бы не использовать это свойство, так как Microsoft говорят, что это только для внутреннего использования:

"This API supports the .NET Framework infrastructure and is not intended to be used directly from your code."

Однако, вы должны быть в состоянии использовать Thread Local Storage сделать такую ​​же вещь. Эта ссылка дает пример, показывающий, как установить свойство string для потока.

Также см. http://www.c-sharpcorner.com/UploadFile/1d42da/working-with-thread-local-storagetls-in-C-Sharp/

+0

Ой интересно, спасибо! – NibblyPig

+2

В качестве обновления, если вы используете .NET 4.6, вам следует переключиться с использования 'ThreadLocal' на [' AsyncLocal'] (https://msdn.microsoft.com/en-us/library/dn906268 (v = vs.110) .aspx), это позволяет вашему хранилищу перетекать через границу async/wait, где вы можете в конечном итоге перепрыгнуть потоки. –

Смежные вопросы