C#中的线程上下文究竟是什么?

Nib*_*Pig 7 c# wcf threadcontext

我有一个WCF服务,它记录每次调用数据库.稍后,如果发生异常,它也会记录到单独的数据库中.

我想要一种方法将这两个日志绑定在一起,这样我们就可以看到可能导致异常的原因.要做到这一点,我想要一些我可以为每次通话获得的唯一ID.

由于整个事情在单个线程上执行,我可以例如将线程名称设置为GUID,例如.System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString();但这有点笨拙.

在网上搜索,我发现System.Threading.Thread.CurrentContext.SetProperty()但我想知道那个背景到底是什么.它是否设计用于存储线程持续时间的属性?每个线程都是唯一的吗?

如果我同时有5个WCF呼叫,我不希望在上下文中发生什么冲突,如果它不是"每次呼叫"可以这么说.

有人可以澄清吗?

Mat*_*son 6

我不会使用该属性,因为微软称它仅供内部使用:

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

但是,你应该可以Thread Local Storage用来做同样的事情.该链接给出了一个示例,说明如何为线程设置字符串属性.

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

  • 作为更新,如果您使用的是.NET 4.6,则应该使用`ThreadLocal`切换到[`AsyncLocal`](https://msdn.microsoft.com/en-us/library/dn906268(v = vs.110) .aspx),这允许您的存储流经异步/等待边界,您可能最终跳过线程. (2认同)