2013-06-03 29 views
6

我有一个WCF服务,它将每个调用记录到数据库。稍后,如果发生异常,它也会记录到单独的数据库中。C#中的线程上下文究竟是什么?

我想要一种方式将这两个日志绑定在一起,以便我们可以看到可能导致异常的原因。为了做到这一点,我想要一些独特的ID,我可以获得每个电话。因为整个事情正在一个线程上执行,所以我可以例如将线程名称设置为一个GUID,例如。 System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString();但这有点哈克。

在网上搜索,我发现System.Threading.Thread.CurrentContext.SetProperty(),但我想知道具体的背景是什么。它是否被设计为在线程期间存储属性?每个线程是否独一无二?

如果我有5个并发WCF调用,我不希望在上下文中发生的事情之间发生任何冲突,如果它不是'每次调用'可以这么说。

有人可以澄清吗?

回答

5

因为微软说这是仅供内部使用,我不会使用该属性:

"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/

+0

哦有趣,谢谢! – NibblyPig

+2

作为更新,如果您使用的是.NET 4.6,则应该将'ThreadLocal'切换为['AsyncLocal'](https://msdn.microsoft.com/zh-cn/library/dn906268(v = vs.110) ).aspx),这可以让您的存储在异步/等待边界上流动,您可以最终跳出线程。 –