C# 取消注册租约引发InvalidOperationException
我有一个使用插件的应用程序。我将插件加载到另一个appdomain中。 我使用RemoteHandle类来防止对象在5分钟后被垃圾收集 只要我的应用程序在运行,这就很有效,但当它关闭时,我在注销时会收到InvalidOperationExceptionC# 取消注册租约引发InvalidOperationException,c#,.net,appdomain,C#,.net,Appdomain,我有一个使用插件的应用程序。我将插件加载到另一个appdomain中。 我使用RemoteHandle类来防止对象在5分钟后被垃圾收集 只要我的应用程序在运行,这就很有效,但当它关闭时,我在注销时会收到InvalidOperationException internal static void Unregister(MarshalByRefObject value) { if (value != null && RemotingServices.IsTra
internal static void Unregister(MarshalByRefObject value)
{
if (value != null && RemotingServices.IsTransparentProxy(value))
{
lock (_syncLock)
{
ReferencedLease r;
if (_leaseReferences.TryGetValue(value, out r) && --r.ReferenceCount <= 0)
{
// Note: Dictionary clears key and value from bucket list upon remove.
_leaseReferences.Remove(value);
r.Lease.Unregister(_instance); // <----- Here i get the exception
}
}
}
}
为什么会出现这种异常?我会订阅app domains Unload事件,查看应用程序域是否已经卸载。如果是这样,那么我怀疑您不再需要注销该句柄(只需吞下异常),因为CLR已经为您完成了这项工作。这只是一个理论,但可能会给您提供更多信息。您会遇到此异常,因为代码正在终结器线程中运行。您正在引用已完成的对象。最终确定对象的顺序是不确定的
这就是它的原因,从片段中我不清楚你会怎么做。我在Pocket Silicon上写了一篇原始文章。我们也遇到过这个问题,我们目前的工作是在这里捕获异常。我想知道外域是否仍然存在,但尚未找到(是的,我可以让该域告诉我它何时消失,但我不希望对远程对象提出额外要求) 下面是我们当前使用的catch块:
try
{
// Catch here -- if we are finalizing we may have already
// finalized the weak handle in the table or the lease may
// have already been unloaded.
r.Lease.Unregister(Sponsor.instance);
}
catch (InvalidOperationException) { }
catch (AppDomainUnloadedException) { }
我会更新帖子。没错。域被卸载,然后我尝试处理下一个插件。。。我可以将两者都设置为已接受吗?这是正确的。域被卸载,然后我尝试处理下一个插件。。。我可以将两者都设置为已接受吗?
try
{
// Catch here -- if we are finalizing we may have already
// finalized the weak handle in the table or the lease may
// have already been unloaded.
r.Lease.Unregister(Sponsor.instance);
}
catch (InvalidOperationException) { }
catch (AppDomainUnloadedException) { }