首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MarshalByRefObject寿命

MarshalByRefObject寿命
EN

Stack Overflow用户
提问于 2014-10-09 13:42:45
回答 1查看 2.9K关注 0票数 2

我有一个.net WinForms应用程序,它将插件( dll )加载到自己的AppDomains中,每个dll使用domain.CreateInstanceAndUnwrap()获得自己的AppDomain。我想要的是,这些对象永远保持连接(直到应用程序停止)。

InitialLeaseTime只需5分钟,但我无法找到改变这种情况的方法。。。我尝试重写远程对象的InitializeLifetimeService():

代码语言:javascript
复制
Public Overrides Function InitializeLifetimeService() As Object  
     Return Nothing  
End Function

这里我得到了一个Typeload异常,它说这将违反继承规则。添加

代码语言:javascript
复制
<SecurityPermissionAttribute(SecurityAction.Demand, Flags:=SecurityPermissionFlag.Infrastructure)>
<SecuritySafeCritical>

什么都改变不了。

然后:

代码语言:javascript
复制
Dim tmpObj As Object = domain.CreateInstanceAndUnwrap(type.AssemblyName, type.TypeName)
Dim tmpRemote As tmpRemoteType = CType(tmpObj, tmpRemoteType)

Dim lifetimeService As Object = Runtime.Remoting.RemotingServices.GetLifetimeService(tmpRemote)
Dim lease As ILease = TryCast(lifetimeService, ILease)
If (lease IsNot Nothing) Then
     lease.Register(_sponsor)
 End If

也不会这样做,因为赞助商(这里没有显示)的not()方法从来没有被调用过。

呼叫

代码语言:javascript
复制
lease.Renew(TimeSpan.FromMinutes(300))

直接更改租约的CurrentLeaseTime,但不更改InitialLeaseTime。

最后,我尝试调用shared (静态)属性LeaseTime,这实际上导致了在租约开始时CurrentLeaseTime的更改,但同样,而不是 InitialLeaseTime,它似乎在5分钟后就结束了,我的远程对象被gc‘’ed了:

代码语言:javascript
复制
LifetimeServices.RenewOnCallTime = System.TimeSpan.FromMinutes(300)

任何帮助都是非常感谢的,Thx!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-09 14:07:40

不知道是怎么回事,但这是怎么回事

代码语言:javascript
复制
var sponsor = new Sponsor();  // manages lifetime of the object in otherDomain
var target = otherDomain.CreateInstanceFromAndUnwrap(assemblyFilename, typeFullName) 
    as MarshalByRefObject;

var lease = target.InitializeLifetimeService() as ILease;
lease.Register(sponsor);

在这种情况下,只需要保留对目标(显而易见)和赞助商的引用。赞助商是一个管理订阅的类:

代码语言:javascript
复制
class Sponsor : MarshalByRefObject, ISponsor
{
    public bool Release { get; set; }

    public TimeSpan Renewal(ILease lease)
    {
        // if any of these cases is true
        if (lease == null || lease.CurrentState != LeaseState.Renewing || Release)
            return TimeSpan.Zero; // don't renew
        return TimeSpan.FromSeconds(1); // renew for a second, or however long u want
    }
}

当您完成它时,只需将发行版设置为赞助方上的true,然后让它离开。你也可以通过在赞助商上实现IDisposable来处理这个问题,如果这让你很想的话。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26280030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档