gpt4 book ai didi

c# - MarshalByRefObject 生命周期

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:52 25 4
gpt4 key购买 nike

我有一个 .net WinForms 应用程序,它可以将插件 (dll) 加载到它们自己的 AppDomain 中,每个 dll 使用 domain.CreateInstanceAndUnwrap() 获得自己的 AppDomain。我想要的是,这些对象永远保持连接(直到应用程序停止)。
InitialLeaseTime 是 5 分钟,但我找不到改变它的方法。 ..我尝试覆盖远程对象的 InitializeLifetimeService():

Public Overrides Function InitializeLifetimeService() As Object  
Return Nothing
End Function

这里我得到一个 Typeload-Exception,说这会破坏继承规则。添加

<SecurityPermissionAttribute(SecurityAction.Demand, Flags:=SecurityPermissionFlag.Infrastructure)>
<SecuritySafeCritical>

不会改变任何东西。

然后:

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

两者都不这样做,因为不知何故从未调用赞助商的 Renewal() 方法(此处未显示)。

打电话

lease.Renew(TimeSpan.FromMinutes(300))

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

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

LifetimeServices.RenewOnCallTime = System.TimeSpan.FromMinutes(300)

感谢任何帮助,谢谢!

最佳答案

不确定发生了什么,但这是它的工作原理

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);

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

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
}
}

完成后,只需将赞助商的 Release 设置为 true 即可。您也可以通过在 Sponsor 上实现 IDisposable 来处理这个问题,如果您喜欢的话。

关于c# - MarshalByRefObject 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com