我的应用程序中有一个要求,我认为可以通过使用线程本地存储来满足,但我想知道这是否是最好避免的事情之一。
我读过一些关于这个主题的文章:
http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58 http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58
http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx
I know how要使用它,我只是想知道我是否should use it.
有什么建议,需要注意的问题吗?
[Edit]
这是用例:
我通过几种方法集中所有数据访问,这些方法对每个查询进行大量日志记录。我记录的一件事是命令文本的完整转储,其中填充了命令,以便我可以简单地从跟踪日志直接复制粘贴到 Sql Management Studio 中。
当我收到未处理的异常时,我会在网络应用程序的 global.asax 中向管理员发送电子邮件,其中包含尽可能多的信息。当我收到 SqlException 时,我想将 sql 命令转储文本放入此电子邮件中,这样当页面因查询而崩溃时,这将节省我挖掘跟踪日志的时间。
我不想更改数据访问类的方法签名,这样我就可以在堆栈中一路传递一些引用,以便在出现异常时将其取出。我在想也许 TLS 是放置“lastsqlcommand”之类的东西的好地方,但这看起来不是一个可行的解决方案。
ASP.NET 应用程序的一个陷阱:单个请求的处理可能会切换线程,即同一会话中存在并行请求时。因此,您在 HttpApplication.PostRequireRequestState 事件之前放入 TLS 中的任何内容稍后可能不会出现,因为您位于不同的线程上。
[提问者编辑]
对于我的特定用例,我最终向 SqlException.Data 字典添加了一个键值对,然后在记录异常详细信息时检索该字典。这为我提供了我希望使用线程本地存储的功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)