Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
C# 当线程池线程返回池时,更改线程池线程的区域性是否会影响线程池?_C#_Multithreading_Threadpool_Currentculture - Fatal编程技术网

C# 当线程池线程返回池时,更改线程池线程的区域性是否会影响线程池?

C# 当线程池线程返回池时,更改线程池线程的区域性是否会影响线程池?,c#,multithreading,threadpool,currentculture,C#,Multithreading,Threadpool,Currentculture,如果我设置线程池线程的CurrentCulture,那么当线程完成执行并返回到线程池时会发生什么?它是否将其CurrentCulture重置回默认值(无论这意味着什么),或者它是否会保留我在其上设置的区域性 我希望框架将线程重置为默认状态以防止出现这种情况,但找不到任何相关文档。我找到的最接近的是MSDN文档: 当线程池重用线程时, 它不会清除线程中的数据 本地存储或在 用ThreadStaticAttribute标记 属性因此,数据 由一个线程存储在线程本地存储中 方法可以暴露于任何其他 方法

如果我设置线程池线程的
CurrentCulture
,那么当线程完成执行并返回到线程池时会发生什么?它是否将其
CurrentCulture
重置回默认值(无论这意味着什么),或者它是否会保留我在其上设置的区域性

我希望框架将线程重置为默认状态以防止出现这种情况,但找不到任何相关文档。我找到的最接近的是MSDN文档:

当线程池重用线程时, 它不会清除线程中的数据 本地存储或在 用ThreadStaticAttribute标记 属性因此,数据 由一个线程存储在线程本地存储中 方法可以暴露于任何其他 方法执行的 线程池线程

这似乎表明线程在返回时未重置


我已经尝试了一些示例代码来测试这一点,而且区域性似乎已经重置,但我不相信我正在正确地测试这一行为,因为我认为我只使用了线程池线程的一小部分,因此无法确定我正在测试一个已经设置了区域性的线程。

我不会依赖ThreadPool来重置信息,特别是因为您引用的文本

如果您担心“更改”线程池的区域性,我会确保在线程任务完成后重置它。这是一项非常简单的任务


我不相信当前的线程池能做到这一点,但即使它做到了,也不能安全地认为.NET 4+的线程池实现不会改变。

这实际上更多的是一个理论问题。我没有这样做,但遇到了一种情况,即新线程在与主线程不同的文化中运行(正如指定的行为)。我很想知道会发生什么,因为一旦线程完成,很容易忘记设置区域性。当线程池创建新线程时,它们将使用包含该线程的AppDomain的区域性。顺便说一句,更改它确实会持续—但您永远不知道是否要“重用”该线程,而且线程池确实会使线程失效,因此这几乎会导致未定义的、不可预测的行为。@Reed Copsey—在这种情况下,我如何找到“AppDomain的文化”。我可以找到对线程区域性的引用,但找不到AppDomain。我问这个问题的原因是我正在使用System.Threading.Task API创建后台任务,我相信默认实现使用ThreadPool。生成的线程似乎具有默认的系统区域性,而不是我在父线程上设置的任何区域性。我想要一种为整个应用程序设置默认区域性的方法,但我没有找到一种方法。@Anderson:我会存储您的主线程区域性,并根据需要将其传递给任务实例。大多数任务,因为它们是后台操作,实际上并不担心文化,所以这应该是很少需要的。在UI上安排的任何任务都会自动获取UI文化…@Reed Copsey:是的,我现在一直在通过闭包传递它们。你提到的“AppDomain文化”让我充满希望;这正是我想要的,但它似乎不是一个真正的功能。在WPF应用程序中,有时我需要从UI线程获取数据。通常,这些数据是用来显示的,但其翻译信息存储在数据存储中,因此我需要在后台线程上传递正确的区域性以及查询。我同意,如果我使用文化来获取资源等,我只会在表示层的UI线程上这样做。稍微相关,但主要用于参考: