While working with multi-threaded applications build over a DI framework it would be extremely useful to have objects that are specific to the context of a thread. My most favorite IoC framework, Unity, provides awesome lifetime managers that can be used to handle situations like these.
Scenarios
The most common scenario where I came across this is to group application logs by a specific thread. Each thread does a specific job and I wanted to prefix specific attribute to the log. A smart lazy person would probably just start logging the thread ID. I know that is quite simple for you to understand the logs. But when a somewhat non-technical person (project managers) wish to see the logs, you might want to make the logs more meaningful.
I once worked on this application that performed a lot of calculations on separate threads. A complex calculation was forked into multiple threads. I wanted to store the output for reuse within a thread. (Lets skip the nitty-gritties of
the app). In that situation a ‘PerThreadStore’ came in extremely handy.
ThreadStatic attribute
There is a very simple way to create thread specific properties. Just use the [ThreadStatic] attribute. Quite common among the multi-threaded developers. But using this as an extension of your IoC framework makes the application quite cool to develop.
PerThreadLifetimeManager with Unity
/// <summary> /// Extends the LifetimeManager to define a class that provides a lifetime per thread /// </summary> public class PerThreadLifetimeManager : LifetimeManager { /// <summary> /// Overridden method that returns the value of the stored object /// </summary> /// <returns>The value of the object</returns> public override object GetValue() { return PerThreadStore.Item; } /// <summary> /// Overridden method that removes the value for the stored object /// </summary> public override void RemoveValue() { PerThreadStore.Item = null; } /// <summary> /// Overridden method that adds a value to the stored object /// </summary> /// <param name="newValue">The value to be stored</param> public override void SetValue(object newValue) { PerThreadStore.Item = newValue; } }
/// <summary> /// A store that stores a static object that has a single value per thread /// </summary> public class PerThreadStore { [ThreadStatic] private static object _Item; /// <summary> /// Gets or sets any value to be stored per thread /// </summary> public static object Item { get { return _Item; } set { _Item = value; } } }
Peace