- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 .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/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!