54

I have some code where I use a thread static object in C#.

[ThreadStatic]
private DataContext connection 

I was wondering, in this case, what if any change would I get if I put the static modifier on the thread static context?

[ThreadStatic]
private static DataContext connection 

With the first would there be one copy of the context per instance per thread, with the other only one copy per thread?

itsmatt
  • 31,265
  • 10
  • 100
  • 164
Anthony D
  • 10,877
  • 11
  • 46
  • 67

3 Answers3

58

The ThreadStaticAttribute is only designed to be used on static variables, as the documentation points out. If you use it on an instance variable, I suspect it will do precisely nothing.

Noldorin
  • 144,213
  • 56
  • 264
  • 302
  • 2
    Anyone aware of any documentation that describes the official policy on what it's supposed to do? If it is not supposed to be used in this way shouldn't it cause a compile error, or can attributes not cause compile errors? – Catskul Jan 28 '10 at 23:41
  • 7
    It would be great if it were a compiler error, because I've just spent a couple of hours tracking a mysterious threading-related bug, which turned out to be due to [ThreadStatic] being used on an instance field and thus having no effect... – Roman Starkov Apr 10 '10 at 12:11
  • 5
    Just remember though, the ThreadPool shares threads (and ThreadStatic) across several tasks. You want to make sure the parallel task you are running is not running in a thread from the ThreadPool. – eduncan911 Jul 19 '12 at 12:35
9

In the first case it would probably be ignored, whereas in the second case you are correct, one instance per thread.

Otávio Décio
  • 73,752
  • 17
  • 161
  • 228
6

In Microsoft Docs, it says:

Indicates that the value of a static field is unique for each thread.

So I guess your first case is incorrect. The attribute will probably be ignored.

Pang
  • 9,564
  • 146
  • 81
  • 122
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758