Ich denke, ich brauche Hilfe, um zu verstehen, wie statische Objekte in einer ASP.Net-Anwendung bestehen bleiben. Ich habe dieses Szenario:Warum ist der "Kontext" meiner statischen ASP.Net-Funktion zwischen Benutzersitzungen?
someFile.cs in einer Klassenbibliothek:
public delegate void CustomFunction();
public static class A {
public static CustomFunction Func = null;
}
someOtherFile.cs in einer Klassenbibliothek:
public class Q {
public Q() {
if (A.Func != null) {
A.Func();
}
}
}
Einige ASP.Net Seite:
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();
}
Die Idee ist, dass ich ein Business-Objekt habe, das einige Operationen auf der Basis einer Callback-Funktion auf UI-Ebene ausführt. Ich setze die Callback-Funktion in Page_Init auf eine statische Variable (in der realen Code-Version, auf der Master-Seite, wenn das einen Unterschied macht). Ich dachte, dass jede Ausführung der Seite, unabhängig davon, aus welcher Benutzersitzung sie stammt, die Logik dieser Funktion durchläuft, aber auf ihrer eigenen Datenmenge operiert. Was stattdessen zu geschehen scheint, ist eine Nebenläufigkeitsproblematik.
Wenn ich eine Benutzersitzung ausfühle, während sie zwischen den Anrufen zu dieser Rückruffunktion schläft, starte eine andere Benutzersitzung, wenn die erste Sitzung aus dem Ruhezustand zurückkommt, nimmt sie die Sitzungs-ID aus der zweiten Benutzersitzung auf. Wie kann das möglich sein?
Ausgabe von 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)
Warum den Kontext der Funktion (das heißt, seine lokalen Daten, etc.) von einer Benutzersitzung zu einem anderen überschrieben werden?
Danke, jeder, für die Hilfe. StackOverflow-Regeln :) –