2013-06-03 16 views
6

Ho un servizio WCF e registra ogni chiamata al database. Successivamente, se si verifica un'eccezione, viene registrata anche in un database separato.Che cosa è esattamente il contesto del thread in C#?

Volevo un modo per legare insieme questi due registri in modo da poter vedere cosa potrebbe aver causato l'eccezione. Per fare questo, volevo una sorta di ID univoco che potevo ottenere per ogni chiamata.

Poiché l'intero processo è in esecuzione su un singolo thread, è possibile ad esempio impostare il nome del thread su un GUID, ad es. System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString(); ma questo è un po 'hacky.

Cercando in rete, ho scoperto System.Threading.Thread.CurrentContext.SetProperty() ma mi chiedo esattamente quale sia il contesto. È progettato per memorizzare le proprietà per la durata di un thread? È unico per thread?

Se ho 5 chiamate WCF simultanee, non voglio che ci siano conflitti tra ciò che accade nel contesto se non è "per chiamata", per così dire.

Qualcuno potrebbe chiarire?

risposta

5

non vorrei usare la proprietà dal momento che Microsoft dice che è solo per uso interno:

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

Tuttavia, si dovrebbe essere in grado di utilizzare Thread Local Storage di fare lo stesso tipo di cosa. Quel collegamento fornisce un esempio che mostra come impostare una proprietà stringa per un thread.

vedere anche http://www.c-sharpcorner.com/UploadFile/1d42da/working-with-thread-local-storagetls-in-C-Sharp/

+0

Ooh interessante, grazie! – NibblyPig

+2

Come aggiornamento, se si utilizza .NET 4.6 è necessario passare dall'uso di 'ThreadLocal' a [' AsyncLocal'] (https://msdn.microsoft.com/en-us/library/dn906268 (v = vs.110) .aspx), questo consente allo storage di scorrere attraverso un limite asincrono/atteso in cui potresti finire per saltare i thread. –

Problemi correlati