c# - C# 类库的线程本地存储

标签 c# multithreading global-variables

我有一个非常古老但非常大的库,我正在考虑将其转换为 C# 类库。现有的库使用了很多存储在 TLS 中的全局变量。 C# 没有全局变量的真正概念,但一种解决方法是使用一个名为 GlobalVar 之类的静态类,并将它们全部放在此类中,以便可以通过 GlobalVar.xxxxxx 访问它们

但是,我的想法是,这将破坏所有正在转换的现有代码,因为 GlobalVar 类将是一个普通的全局类,而不是每个线程存储。有没有办法让这些全局变量成为每个线程?即 C# 中 __declspec (thread) static 的等价物是什么?

我应该补充一点,我讨厌全局变量。我认为它们通常是设计不佳的结果。但是,由于时间紧迫,第一阶段是将库转换为 C#,然后第二阶段将适本地重新设计它们。

最佳答案

ThreadLocal类(在 4.0 中引入)和 ThreadStaticAttribute .

ThreadStaticAttribute 只能用于static 字段。 ThreadLocal 类可用于“普通”字段,但速度较慢。

请注意,如果您不控制您所在的线程(例如,您是 ASP.NET 的一个页面并且您从一个“随机”预用线程开始,或者您是一个 ThreadPool 的线程) ,那么你的“线程静态”(一般来说,不是属性)变量将使用前一个线程的旧值进行预初始化。 (参见示例 A tale of two techniques: The [ThreadStatic] Attribute and System.Web.HttpContext.Current.Items)

我忘记了,还有 Thread.AllocateDataSlot具有与其他人相似的“目标”。

关于c# - C# 类库的线程本地存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850874/

相关文章:

java - Java/C# 中的 C++ 切片

c# - 如何从 C# 调用 C++ API

C# - 按照另一个列表中项目的顺序高效地从一个列表中提取项目

java - 按顺序运行3个线程java

c++ - 全局变量的默认存储类是什么?

c# - OLEDB 读取 CSV 文件仅返回第一列

java - 运行多线程代码时内存不足异常

python - Python 中的线程启动 Hook

python - 如何使用 tkinter 创建下一个按钮以在多个框架之间切换

python - 为什么必须创建一个新的全局变量来引用 "exec"中的当前类实例?