我正在尝试使用AppDomain来管理一些遗留代码,这些代码在多线程环境中包含大量静态字段。AppDomain中的静态字段
我看了回答了这个问题:How to use an AppDomain to limit a static class' scope for thread-safe use?,认为这是相当有前途,并决定在装配ClassLibrary1.dll一个非常简单的类来尝试一下:
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
,这里是一个加载assemblyinto 2个不同的我的代码应用程序域和调用IncrementAndPrint()几次:
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);
我期待的输出为:
0
1
2
0
1
2
,因为将存在AppDomain的每个实例的本地静态字段Value的副本。然而,而我得到的是:
0
1
2
3
4
5
它告诉我他们仍然都共享相同的副本的静态字段值。 任何人都可以告诉我我在这里做错了什么?
更新:
我想埃里克的建议,现在我叫CreateInstanceAndUnwrap(如下图)在AppDomain类的方法,而不是调用load()和的GetType()。另外,我已将IncrementAndPrint转换为实例方法而不是静态方法。但是,我仍然得到相同的结果。
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();
你打电话给t他是当前应用程序域中的静态方法。您需要创建一个调用Class1类的Static方法的Instance方法。 – 2010-11-28 21:39:41
嗨Erik,如果你看看我更新的源代码,我已经将IncrementAndPrint()转换为实例方法,并使用CreateInstanceAndUnWrap()在各个应用程序域中创建实例。然而,我仍然得到相同的结果 – oscarkuo 2010-11-29 00:23:15