c# - ThreadStatic 属性如何工作?

标签 c# static threadstatic

[ThreadStatic] 属性如何工作?我假设编译器会发出一些 IL 来填充/检索 TLS 中的值,但查看反汇编时它似乎并没有在那个级别执行它。

作为后续,如果你把它放在一个非静态成员上会发生什么?我们让开发人员犯了这个错误,编译器甚至没有发出警告。

更新

此处回答的第二个问题:ThreadStatic Modified with Static C#

最佳答案

How does [ThreadStatic] attribute work?

你可以认为标有ThreadStatic的字段附加到一个线程,它的生命周期与线程的生命周期相当。

因此在伪代码中,ThreadStatic 类似于(在语义上)将键值附加到线程:

Thread.Current["MyClass.myVariable"] = 1;
Thread.Current["MyClass.myVariable"] += 1;

但语法更简单:

class MyClass {
  [ThreadStatic]
  static int myVariable;
}
// .. then
MyClass.myVariable = 1;
MyClass.myVariable += 1;

what happens if you put it on a non-static member?

我相信它被忽略了:

    class A {
        [ThreadStatic]
        public int a;
    }
    [Test]
    public void Try() {
        var a1 = new A();
        var a2 = new A();
        a1.a = 5;
        a2.a = 10;
        a1.a.Should().Be.EqualTo(5);
        a2.a.Should().Be.EqualTo(10);
    }

另外值得一提的是,与普通静态字段相比,ThreadStatic 不需要任何同步机制(因为状态不共享)。

关于c# - ThreadStatic 属性如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227676/

相关文章:

c# - 静态类中的方法是如何调用的

java - 不能从静态上下文中引用非静态字段 - Main 方法

C# ThreadStatic + volatile 成员未按预期工作

.net - 我可以(安全地)在 ADO.NET 数据服务中使用 ThreadStatic 属性吗?

c# - ThreadStatic 与线程本地 <T> : is generic better than attribute?

C# 多边形中的点

c# - 静态方法继承的正确替代方法是什么?

c# - 如何以编程方式推送 ToggleButton?

c# - 从 TableDependency 优雅地处理数万个事件 C#

c# - 如何从PDF中获取文本的字体名称?