Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在';是否重新使用.NET线程池线程?_.net_Threadpool_Thread Local Storage - Fatal编程技术网

在';是否重新使用.NET线程池线程?

在';是否重新使用.NET线程池线程?,.net,threadpool,thread-local-storage,.net,Threadpool,Thread Local Storage,我知道LogicalCallContext是使用这些方法设置的,如果您使用ThreadPool.QueueUserWorkItem之类的工具,它将流向新线程。问题是,当线程池重新使用具有此对象的线程时,逻辑调用上下文是否重置?还是我最终会陷入一个不属于我的状态 两次提及: 从.net源代码中可以看出,每当将新任务排入线程池时,整个执行上下文都会被克隆。这个上下文还包括与安全相关的内容,所以我认为如果不重置上下文,这将是一个重大的禁忌 在测试应用程序中,它似乎工作正常,即使我在使用完它之后将上下

我知道LogicalCallContext是使用这些方法设置的,如果您使用ThreadPool.QueueUserWorkItem之类的工具,它将流向新线程。问题是,当线程池重新使用具有此对象的线程时,逻辑调用上下文是否重置?还是我最终会陷入一个不属于我的状态

两次提及:

  • 从.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,在其中我自己设置/清除一些线程本地状态,然后它应该只是一个全局替换(几乎)。顺便说一句,如果你将注释作为一个答案,我会将问题标记为已回答。。。