Tip of the day: ThreadStatic attribute
According to the msdn documentation, the ThreadStatic attribute "Indicates that the value of a static field is unique for each thread."
A practical use for it can be a registrar implementation. A registrar can be used as a static entry point to store context data for say, a request that is being processed by several classes that need to share data.
Implementation example:
public static class Registrar { [ThreadStatic] private static Dictionary<string, object> m_registrar = null; private static Dictionary<string, object> LocalDictionary { get { if (m_registrar == null) { m_registrar = new Dictionary<string, object>(); } return m_registrar; } } public static object Get(string key) { return LocalDictionary[key]; } public static void Set(string key, object value) { LocalDictionary[key] = value; } }
Now since the m_registrar is marked with ThreadStatic attribute, is static per thread, which means that no locking is required and no data corruption can occur.
A real world example for using such strategy is HttpContext.Items
Gilad pointed out two important points:
- ASP.NET is changing threads under the hood so don’t use it there since u will most probably get your data corrupted. The HttpContext knows how to handle that so use it.
- When using a thread pool, the threads are not killed and so when a thread completes execution and returned to the pool, the static data is still kept. In this case u should use an execution wrapper than clears the per thread static data after the thread complete execution.