我想我需要一些帮助来理解静态对象如何在 ASP.Net 应用程序中持久存在。我有这种情况:
类库中的 someFile.cs:
public delegate void CustomFunction();
public static class A {
public static CustomFunction Func = null;
}
类库中的 someOtherFile.cs:
public class Q {
public Q() {
if (A.Func != null) {
A.Func();
}
}
}
一些 ASP.Net 页面:
Page_Init {
A.Func = MyFunc;
}
public void MyFunc() {
System.IO.File.AppendAllText(
"mydebug.txt", DateTime.Now.ToString("hh/mm/ss.fff", Session.SessionID));
}
Page_Load {
Q myQ = new Q();
System.Threading.Thread.Sleep(20000);
mQ = new Q();
}
这个想法是我有一个业务对象,它基于 UI 级别的回调函数执行一些操作。我将回调函数设置为 Page_Init 上的静态变量(在实际代码版本中,在母版页中,如果这有所不同)。我认为页面的每次执行,无论它来自哪个用户会话,都将通过该函数的逻辑,但对它自己的数据集进行操作。相反,似乎正在发生的是并发问题。
如果我运行一个用户会话,那么当它在调用该回调函数之间睡眠时,启动另一个用户会话,当第一个会话从睡眠中恢复时,它会从第二个用户会话中获取会话 ID。这怎么可能?
mydebug.txt 的输出:
01/01/01.000 abababababab (session #1, first call)
01/01/05.000 cdcdcdcdcdcd (session #2, first call - started 5 seconds after session #1)
01/01/21.000 cdcdcdcdcdcd (session #1 returns after the wait but has assumed the function context from session #2!!!!!)
01/01/25.000 cdcdcdcdcdcd (session #2 returns with its own context)
为什么函数的上下文(意思是其本地数据等)会从一个用户会话覆盖到另一个用户会话?