AppDomain 和线程

Posted

技术标签:

【中文标题】AppDomain 和线程【英文标题】:AppDomain and threading 【发布时间】:2009-06-26 12:41:12 【问题描述】:

基本上,根据我在互联网上搜索到的少量信息,线程可以在 AppDomain 之间传递。现在,我编写了以下代码:

    const string ChildAppDomain = "BlahBlah";
    static void Main()
    
        if (AppDomain.CurrentDomain.FriendlyName != ChildAppDomain)
        
            bool done = false;
            while (!done)
            
                AppDomain mainApp = AppDomain.CreateDomain(ChildAppDomain, null, AppDomain.CurrentDomain.SetupInformation);
                try
                
                    mainApp.ExecuteAssembly(Path.GetFileName(Application.ExecutablePath));
                
                catch (Exception ex)
                
                    // [snip]
                
                AppDomain.Unload(mainApp);
            
        
        else
        
            // [snip] Rest of the program goes here
        
    

这一切正常,一切都在点击到位......主线程进入我的程序的新版本并开始在主应用程序主体中运行。我的问题是,我将如何让它回到父母AppDomain?这可能吗?我想要实现的是在两个域之间共享一个类的实例。

【问题讨论】:

【参考方案1】:

您不能直接在AppDomains 之间共享类的实例。为此,您应该从MarshalByRefObject 派生类,并使用远程处理从另一个AppDomain 访问实例。

【讨论】:

没有比 MSDN 更好的了:msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx 此论坛帖子包含相关代码示例:social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/…【参考方案2】:

.Net 中的一个对象只能存在于一个 AppDomain 中。它不可能同时存在于 2 个 AppDomain 中。

但是,您可以使用 .Net Remoting 一次将 .Net 对象的代理推送到多个 AppDomain 中。这将使您的对象看起来像是在多个域中。我相信这就是您正在寻找的。​​p>

网上有很多教程。谷歌搜索“.Net Remoting Tutorial”,这会让你走上正轨。

http://www.beansoftware.com/NET-Tutorials/NET-Remoting-Tutorial.aspx http://msdn.microsoft.com/en-us/library/72x4h507(VS.80).aspx

【讨论】:

以上是关于AppDomain 和线程的主要内容,如果未能解决你的问题,请参考以下文章

AppDomain 是不是在自己的线程中执行?

.NET AppDomain.Unload 触发失控线程

垃圾收集是在进程级别还是 appdomain 级别发生的?

如何从其他 appdomain 获取 UI 线程调度程序?

System.AppDomain类详解

如何使用 AppDomain 限制静态类的范围以进行线程安全使用?