2013-06-03 19 views
6

Mam usługę WCF i loguje każdego połączenia do bazy danych. Później, jeśli wystąpi wyjątek, jest on również rejestrowany w oddzielnej bazie danych.Czym dokładnie jest kontekst wątku w C#?

Potrzebowałem sposobu powiązania obu tych dzienników, abyśmy mogli zobaczyć, co mogło spowodować wyjątek. Aby to zrobić, chciałem jakiegoś unikalnego identyfikatora, który mógłbym uzyskać za każde połączenie.

Ponieważ cała operacja wykonywana jest na jednym wątku, mógłbym na przykład ustawić nazwę wątku na identyfikator GUID, np. System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString();, ale jest to trochę hacky.

Wyszukiwanie w sieci, odkryłem System.Threading.Thread.CurrentContext.SetProperty(), ale zastanawiam się dokładnie, co to jest kontekst. Czy jest przeznaczony do przechowywania właściwości na czas trwania wątku? Czy jest unikalny na wątek?

Jeśli mam 5 równoczesnych wywołań WCF, nie chcę żadnych konfliktów między tym, co dzieje się w kontekście, jeśli to nie jest "per call", że tak powiem.

Czy ktoś może wyjaśnić?

Odpowiedz

5

nie użyłbym tej nieruchomości od Microsoft powiedzieć, że jest tylko do użytku wewnętrznego:

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

Należy jednak mieć możliwość korzystania z Thread Local Storage do tego samego rodzaju rzeczy. Ten link podaje przykład pokazujący, jak ustawić właściwość łańcucha dla wątku.

Zobacz także http://www.c-sharpcorner.com/UploadFile/1d42da/working-with-thread-local-storagetls-in-C-Sharp/

+0

O co ciekawe, dzięki! – NibblyPig

+2

Jako aktualizację, jeśli używasz .NET 4.6, powinieneś przełączyć się z używania "ThreadLocal" na ['AsyncLocal'] (https://msdn.microsoft.com/en-us/library/dn906268 (v = vs.110) .aspx), to pozwala twojemu magazynowi przepływać przez granicę asynchroniczną/czekającą, gdzie możesz skończyć przeskakiwanie wątków. –