C#使用AppDomain时的异常分析:Object ‘XXXX.rem’ has been disconnected or does not exist at the server.

在使用C#的应用程序域的时候,碰到这么一个异常:

System.Runtime.Remoting.RemotingException: Object ‘/76e7cd41_2cd2_4e89_9c03_fae752ec4d59/zb_uualy_cm6kwizjlentfdl_3.rem’ has been disconnected or does not exist at the server.

当你使用AppDomain时,会创建一个Proxy继承自MarshalByRefObject,来跨应用程序域传值。然后在主AppDomain中,使用一个属性或者Dictionary来保存Proxy的引用,但实际的对象是在子AppDomain中,你的主AppDomain中只是保存了一个远程代理。

这时,远程对象的生命周期并不是应用了.NET标准GC规则,而是用了Remoting Lease and Sponsor Mechanism(不知道对应的专业翻译汉语名词)。这意味着,除非我们显式管理子AppDomain的生命周期,否则它会被GC回收并消失,即便主AppDomain中仍然维护着远程代理的引用。当你再次使用远程代理访问子AppDomain时,就抛出了上面的异常。。\(╯-╰)/ 。

(上面异常中,Object的名字是在你 AppDomain.CreateInstanceAndUnwrap 时,随机生成的)

如果你希望能长期使用子AppDomain,不让它过期,需要重写Proxy类的 InitializeLifetimeService ,返回NULL即可。

原文:

http://blogs.microsoft.co.il/sasha/2008/07/19/appdomains-and-remoting-life-time-service/   

thx Sasha Goldshtein

posted @ 2017-12-01 14:28  Snow~Forever  阅读(581)  评论(1编辑  收藏  举报