我的代码看到了一个非常奇怪的问题。
这是线程创建代码(在Home.aspx.cs中)
WindowsIdentity current_identity = WindowsIdentity.GetCurrent();
HttpContext ctx = HttpContext.Current;
Thread worker = new Thread(delegate()
{
WindowsImpersonationContext context = current_identity.Impersonate();
HttpContext.Current = ctx;
MyClass.MyMethod();
context.Undo();
});
worker.CurrentCulture = Thread.CurrentThread.CurrentCulture;
worker.IsBackground = true;
worker.Start();
在MyClass.aspx.cs中,我有线程调用的方法:
public static void MyMethod()
{
if (cache["MyList"] == null)
{
cache["MyList"] = MyList.Get();
}
}
缓存是我们创建的Dictionary<string, object>
,位于HttpContext.Current.Session
。 MyList.Get()基本上是一个工厂方法,最终调用存储过程用数据填充MyList。
在MyClass.aspx.cs中,我还有一个属性:
public static MyList MyList
{
get
{
if (cache["MyList"]) == null) // Breakpoint here
{
cache["MyList"] = MyList.Get();
}
return cache["MyList] as MyList;
}
}
当我导航到Home.aspx.cs时,会创建工作线程并调用MyClass.MyMethod来调用存储过程。我使用SQL事件探查器确保存储过程确实执行。接下来,我导航到MyClass.aspx.cs页面。现在,我在属性MyList的getter中设置的断点被击中。我查看缓存,它只包含3个项目,但它不包含带有“MyList”键的条目。
奇怪的是,也许30秒后到一分钟,缓存会神奇地拥有4个项目。我查看SQL分析器,并再次执行相同的存储过程。
我的问题是:
什么导致缓存不再具有“MyList”键的条目,直到很久以后?是因为线程还没有完成?
导致我的存储过程第二次运行的原因是什么?