.net - 在 .NET 中使用线程本地存储的最佳实践是什么?

标签 .net multithreading thread-local

我在我的应用程序中有一个要求,我认为可以通过使用线程本地存储来满足它,但我想知道它是否是最好避免的事情之一。

我已经阅读了一些关于这个主题的文章:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

我知道如何使用它,我只是想知道我是否应该使用它。

任何建议,要注意的问题?

[编辑]

这是用例:

我通过一些方法收集所有数据访问,这些方法对每个查询进行大量日志记录。我记录的一件事是命令文本的完整转储,其中填充了命令,以便我可以简单地从跟踪日志中直接复制粘贴到 Sql Management Studio。

在我的网络应用程序中的 global.asax 中,当我遇到未处理的异常时,我会向管理员发送电子邮件,其中包含尽可能多的信息。当我收到 SqlException 时,我想将该 sql 命令转储文本放入这封电子邮件中,这将节省我在页面因查询而爆炸时挖掘跟踪日志的时间。

我不想更改我的数据访问类的方法签名,这样我就可以在堆栈中一直传递一些引用,以便在遇到异常时将其取出。我在想也许 TLS 是放置诸如“lastsqlcommand”之类的东西的好地方,但这看起来不是一个可行的解决方案。

最佳答案

asp.net 应用程序的一个问题:单个请求的处理可能会切换线程,即同一 session 中是否存在并行请求。因此,您在 HttpApplication.PostRequireRequestState 事件之前放入 TLS 的任何内容稍后可能不会出现,因为您在不同的线程上。

[由提问者编辑]

对于我的特定用例,我最终向 SqlException.Data 字典添加了一个键值对,然后在我记录异常详细信息时检索它。这给了我希望使用线程本地存储的功能。

关于.net - 在 .NET 中使用线程本地存储的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/175129/

相关文章:

java - 如何在java中的 Action 监听器中启动/恢复和停止/暂停线程

c - 如何从 ml64.exe(MSVC 64 位 X64 汇编程序)访问线程本地存储?

java - java 中的 volatile 与 threadLocal

java - 同步三个线程

java - Servlet 3 规范和 ThreadLocal

c# - 如何对大多数排序的数组进行排序

c# - 解析事件日志条目的消息字段c#

.net - redis 获取列表,其中有键开头

c# - 我怎样才能确保只有一个线程会做某事?

JavaFX 显示新标签然后 hibernate 循环的每次迭代