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.
No comments:
Post a Comment