Ich experimentiere Ideen mit AppDomain zu verwalten, einige Legacy-Code enthält viele statische Felder in einer Multi-Thread-Umgebung.Statische Felder in AppDomain
Ich lese Antworten auf diese Frage: How to use an AppDomain to limit a static class' scope for thread-safe use?, dachte, es recht vielversprechend ist und beschlossen, es mit einer sehr einfachen Klasse in der Montage ClassLibrary1.dll auszuprobieren:
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
und hier ist mein Code, der die assemblyinto 2 verschiedenen Lasten App-Domains und ruft die IncrementAndPrint() mehrmals:
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);
ich die Ausgabe erwartete zu sein:
0
1
2
0
1
2
, da für jede Instanz von AppDomain eine Kopie des statischen Felds Value in local vorhanden ist. Stattdessen, was ich bekam, war:
was mir sagt, dass sie noch alle die gleiche Kopie des statischen Feld Wert teilen. Kann mir jemand sagen, was habe ich hier falsch gemacht?
Update:
habe ich versucht, Erik Vorschlag, jetzt nenne ich CreateInstanceAndUnwrap() -Methode der AppDomain-Klasse anstelle Last von() aufrufen und GetType(), wie unten gezeigt. Außerdem habe ich IncrementAndPrint in eine Instanzmethode und nicht in eine statische Methode konvertiert. Allerdings bekomme ich immer noch das gleiche Ergebnis.
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();
Sie rufen t Die statische Methode in der aktuellen App-Domäne. Sie müssen eine Instance-Methode erstellen, die die Static-Methode für die Class1-Klasse aufruft. –
Hallo Erik, wenn Sie sich meinen aktualisierten Quellcode ansehen, habe ich IncrementAndPrint() in eine Instanzmethode konvertiert und CreateInstanceAndUnWrap() verwendet, um Instanzen in den entsprechenden App-Domänen zu erstellen. Allerdings bekomme ich immer noch das gleiche Ergebnis – oscarkuo
Ich habe vergessen, das 'MarhsalByRefObject' auf Ihrem appDomain-Modell zu erwähnen. –