Мне кажется, мне нужна помощь в понимании того, как статические объекты сохраняются в приложении 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();
}
Идея состоит в том, что у меня есть бизнес-объект, который выполняет некоторую операцию на основе функции обратного вызова на уровне пользовательского интерфейса. Я установил функцию обратного вызова для статической переменной в Page_Init (в реальной версии кода, на главной странице, если это имеет значение). Я думал, что каждое выполнение страницы, независимо от того, с какого пользовательского сеанса она идет, будет проходить через логику этой функции, но работать с собственным набором данных. Кажется, что вместо этого происходит проблема параллелизма.
Если я запускаю один пользовательский сеанс, то, пока он спит между вызовами этой функции обратного вызова, запускает другой пользовательский сеанс, когда первый сеанс возвращается из спящего режима, он получает идентификатор сеанса второго сеанса пользователя. Как это может быть возможно?
Вывод 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)
Почему контекст функции (т.е. ее локальные данные и т. Д.) Перезаписывается от одного сеанса пользователя к другому?