在';是否重新使用.NET线程池线程?
我知道LogicalCallContext是使用这些方法设置的,如果您使用ThreadPool.QueueUserWorkItem之类的工具,它将流向新线程。问题是,当线程池重新使用具有此对象的线程时,逻辑调用上下文是否重置?还是我最终会陷入一个不属于我的状态 两次提及:在';是否重新使用.NET线程池线程?,.net,threadpool,thread-local-storage,.net,Threadpool,Thread Local Storage,我知道LogicalCallContext是使用这些方法设置的,如果您使用ThreadPool.QueueUserWorkItem之类的工具,它将流向新线程。问题是,当线程池重新使用具有此对象的线程时,逻辑调用上下文是否重置?还是我最终会陷入一个不属于我的状态 两次提及: 从.net源代码中可以看出,每当将新任务排入线程池时,整个执行上下文都会被克隆。这个上下文还包括与安全相关的内容,所以我认为如果不重置上下文,这将是一个重大的禁忌 在测试应用程序中,它似乎工作正常,即使我在使用完它之后将上下
- 从.net源代码中可以看出,每当将新任务排入线程池时,整个执行上下文都会被克隆。这个上下文还包括与安全相关的内容,所以我认为如果不重置上下文,这将是一个重大的禁忌
- 在测试应用程序中,它似乎工作正常,即使我在使用完它之后将上下文中的状态设置为一个伪值,只是为了使它更可能在重新使用时,我会有一个坏状态
- 我没有使用任何异步编程、windows窗体/WPF或类似的东西。只有普通的.NET api调用(没有以“Begin…”开头的调用)
- 我明白,仅仅使用线程本地存储是行不通的,因为当线程切换时,它不会被清除
感谢您在2020年编辑:最近在一个大型遗留项目(基本上是一个web服务器)中采用了此方法后,它没有出现任何问题 不能说我推荐它,但如果它能让您避免对大型代码库进行不可能的重构,从而“携带”状态,那么它可能值得一试 我或多或少只是用汉斯的回答来回答
如果您在标签外使用此功能,LCC是远程处理详细信息。信息技术 之所以有效,是因为SecurityContext需要流到tp线程。A. CAS功能,在.NET 4.0中已弃用。你不能在这里得到保修 微软的一些技术似乎也使用了CallContext,比如EntityFramework6,但具体细节还不清楚(它们是否使用spwan threasds,它们是否使用异步编程)
因此,答案应该是否定的,以这种方式使用它是不安全的。您使用的是标签外的此功能,LCC是一个远程处理细节。它之所以有效,是因为SecurityContext需要流向tp线程。CAS功能,在.NET 4.0中已弃用。你不能在这里得到保修。谢谢,汉斯。如果是那样的话,我可能不会这么做。我想我可以做同样的事情,用try/finally来修饰QueueUserWorkItem,在其中我自己设置/清除一些线程本地状态,然后它应该只是一个全局替换(几乎)。顺便说一句,如果你将注释作为一个答案,我会将问题标记为已回答。。。