Bir ASP.Net uygulamasında statik nesnelerin nasıl devam ettiğini anlamak için biraz yardıma ihtiyacım var. Bir sınıf kitaplığındaNeden ASP.Net statik işlevimin kullanıcı oturumları arasında "bağlam" geçiti var?
someFile.cs: Bir sınıf kitaplığında
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();
}
}
}
Bazı ASP.Net sayfa:
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();
}
Bu senaryo var
Fikir, UI düzeyinde bir geri çağırma işlevine bağlı olarak bazı işlemleri yapan bir iş nesnesine sahip olduğumdur. Geri arama işlevini Page_Init üzerinde statik bir değişkene ayarladım (gerçek kod sürümünde, Ana sayfada, fark yaratırsa). Sayfanın her uygulamasının, hangi kullanıcı oturumundan geldiği önemli değil, bu işlevin mantığından geçeceğini, ancak kendi veri kümesinde çalışacağını düşündüm. Bunun yerine gerçekleşmiş gibi görünen bir eşzamanlılık meselesidir.
Bir kullanıcı oturumu çalıştırırsam, o geri arama işlevine yapılan çağrılar arasında uyurken, başka bir kullanıcı oturumu başlatın, ilk oturum uykudan geri döndüğünde, ikinci kullanıcı oturumundan oturum kimliğini alır. Bu nasıl mümkün olabilir? mydebug.txt ait
Çıktı:
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)
Neden işlevin bağlam (anlamı, yerel veri, vb) başka bir kullanıcı oturumundan üzerine ediliyor?
Herkese yardım için teşekkürler. StackOverflow kuralları. :) –