içinde bazı eski kodu bir çok iş parçacıklı ortamda statik alanların bolca içerir yönetmek için uygulama etki alanı kullanarak etrafında fikirler deniyorum. oldukça umut verici olduğunu düşünmüş ve montaj ClassLibrary1.dll çok basit sınıfla denemeye karar verdi, How to use an AppDomain to limit a static class' scope for thread-safe use?:Statik Alanlar AppDomain
Ben cevaplara bu soruyu okumak
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
ve burada 2 farklı assemblyinto yükler kod bu Uygulamanın etki alanları ve IncrementAndPrint çağırır() birkaç kez: Ben bekliyordum
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var assemblyInAppDomain1 = appDomain1.Load("ClassLibrary1");
var assemblyInAppDomain2 = appDomain2.Load("ClassLibrary1");
var class1InAppDomain1 = assemblyInAppDomain1.GetType("ClassLibrary1.Class1");
var class1InAppDomain2 = assemblyInAppDomain2.GetType("ClassLibrary1.Class1");
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
çıktı olmak:
0
1
2
0
1
2
AppDomain her örneği yerel statik alan Değerinin bir kopyası kalır çünkü. Bununla birlikte, benim aldığım şey, bunların hepsinin hala statik alan Değerinin aynı kopyasını paylaştığını söyleyen . Burada neyin yanlış yaptığımı bana söyleyebilir misiniz?
Güncelleme:
Ben şimdi aşağıda gösterildiği gibi yerine Load() ve GetType (çağırma AppDomain sınıfının() yöntemi) CreateInstanceAndUnwrap diyoruz, Erik'in öneri çalıştı. Ayrıca, IncrementAndPrint'i statik bir yöntem yerine örnek yöntemine dönüştürdüm. Ancak, hala aynı sonucu alıyorum.
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var class1InAppDomain1 = (Class1)appDomain1.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
var class1InAppDomain2 = (Class1)appDomain2.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
Arama yapıyorsunuz t Geçerli uygulama alanında statik yöntem. Class1 sınıfındaki Statik yöntemi çağıran bir Örnek yöntemi oluşturmanız gerekir. Benim güncellenmiş kaynak koduna bir göz varsa –
Merhaba Erik, ben bir örnek yöntemine IncrementAndPrint() dönüştürülür ve() ilgili uygulama alanlarındaki örneklerini oluşturmak için CreateInstanceAndUnWrap kullanmaya başlamışlardır. Ancak, hala aynı sonucu alıyorum – oscarkuo
Ben appDomain Model üzerinde 'MarhsalByRefObject' bahsetmeyi tamamen unutmuşum. –