Myślę, że potrzebuję pomocy w zrozumieniu, w jaki sposób statyczne obiekty pozostają w aplikacji ASP.Net. Mam następujący scenariusz:Dlaczego moja funkcja statyczna ASP.Net "kontekst" skrzyżowania między sesjami użytkownika?
someFile.cs w bibliotece klasy:
public delegate void CustomFunction();
public static class A {
public static CustomFunction Func = null;
}
someOtherFile.cs w bibliotece klasy:
public class Q {
public Q() {
if (A.Func != null) {
A.Func();
}
}
}
Niektóre strona 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();
}
Chodzi o to, że mam obiekt biznesowy, który wykonuje pewne operacje w oparciu o funkcję zwrotną na poziomie interfejsu użytkownika. Ustawiam funkcję zwrotną na statyczną zmienną w Page_Init (w prawdziwej wersji kodu, na stronie wzorcowej, jeśli to robi różnicę). Sądziłem, że każde wykonanie strony, bez względu na to, z jakiej sesji użytkownika pochodzi, przejdzie przez logikę tej funkcji, ale będzie działać na własnym zestawie danych. Zamiast tego wydaje się, że jest to kwestia współbieżności.
Jeśli uruchomię jedną sesję użytkownika, to podczas snu między połączeniami do tej funkcji oddzwaniania, rozpocznij sesję innego użytkownika, kiedy pierwsza sesja wraca z trybu uśpienia, odbiera identyfikator sesji z sesji drugiego użytkownika. Jak to możliwe?
Wyjście 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)
Dlaczego kontekst danej funkcji (czyli jego lokalne dane, itd.) Są zastępowane z jednej sesji użytkownika do innej?
Dziękuję wszystkim za pomoc. Zasady StackOverflow. :) –