Note that there are some explanatory texts on larger screens.

plurals
  1. POThrow a NullReferenceException while calling the set_item method of a Dictionary object in a multi-threading scenario
    text
    copied!<p>Our website has a configuration page such as "config.aspx", when the page initializing will load some information from a configuration file. To cache the loaded information we provided a factory class and we call a public method of the factory to get the configuration instance when the page loaded. But sometimes when the Application Pool is restarted, we found some error message in the Event Log such as below:</p> <pre> Message: Object reference not set to an instance of an object. Stack: at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value) at ObjectFactory.GetInstance(string key) at config.Page_Load(Object sender, EventArgs e) at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) </pre> <p>The factory class implements like below:</p> <pre> <code> public static class ObjectFactory { private static object _InternalSyncObject; private static Dictionary _Instances; private static object InternalSyncObject { get { if (_InternalSyncObject == null) { var @object = new object(); Interlocked.CompareExchange(ref _InternalSyncObject, @object, null); } return _InternalSyncObject; } } private static Dictionary Instances { get { if (_Instances == null) { lock (InternalSyncObject) { if (_Instances == null) { _Instances = new Dictionary(); } } } return _Instances; } } private static object LoadInstance(string key) { object obj = null; // some statements to load an specific instance from a configuration file. return obj; } public static object GetInstance(string key) { object instance; if (false == Instances.TryGetValue(key, out instance)) { instance = LoadInstance(key); Instances[key] = instance; } return instance; } } </code> </pre> <p>I guess the exception was thrown by the line "Instances[key] = instance;", because its the only code that could call <code>set_Item</code> method of a dictionary. But if the "Instances" value is null, it will thrown a <code>NullReferenceException</code> when calling the <code>TryGetValue</code> method and the top frame of the stacktrace should be the <code>GetInstance</code> not the <code>Insert</code>. Does anyone know how the dictionary could throw a <code>NullReferenceException</code> when call the <code>set_Item</code> method in multi-threading scenario?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload