C# CER可以用来保证永远不会调用finalize吗?

C# CER可以用来保证永远不会调用finalize吗?,c#,multithreading,iis,interop,cer,C#,Multithreading,Iis,Interop,Cer,我们有一个非常棘手的互操作问题,其中用于初始化第三方系统的线程必须与用于终止它的线程相同。否则将导致死锁。我们正在从IIS中托管的WCF服务执行互操作。目前,这种清理是在处置过程中完成的,通常效果很好。不幸的是,在重载情况下,IIS将进行粗鲁的卸载,我们永远无法调用dispose。我们可以将关闭逻辑移到一个关键的终结器中,但这没有帮助,因为我们不再有权访问初始化线程!此时,我们唯一的办法似乎是通知CLR AppDomain现在可能处于损坏状态。然而,我不知道如何做到这一点(或者这是否可能)。这可

我们有一个非常棘手的互操作问题,其中用于初始化第三方系统的线程必须与用于终止它的线程相同。否则将导致死锁。我们正在从IIS中托管的WCF服务执行互操作。目前,这种清理是在处置过程中完成的,通常效果很好。不幸的是,在重载情况下,IIS将进行粗鲁的卸载,我们永远无法调用dispose。我们可以将关闭逻辑移到一个关键的终结器中,但这没有帮助,因为我们不再有权访问初始化线程!此时,我们唯一的办法似乎是通知CLR AppDomain现在可能处于损坏状态。然而,我不知道如何做到这一点(或者这是否可能)。这可能是合同在课堂上的效用,但我承认我并不完全理解这些


编辑:或者,这可能被视为终结器中的线程关联问题。如果有人对此有一个聪明的解决方案,我洗耳恭听:)

如果可能,尝试将依赖于本机依赖性的代码拆分为独立的Windows服务应用程序。如果它不能很好地与WCF/IIS配合使用,您应该避免冲突,而不是与之对抗。

您正在处理的组件是本机的还是托管的?本机的。这是一个具有自己内存管理的系统的c api,等等,你可能是对的。我们已经讨论过这一点,尽管我现在还不愿意让步:)另外,我应该说-我不确定这是否真的解决了问题,因为CLR卸载可能是生活中的一个事实(尽管在您的解决方案中不太可能),您的意思是您对应用程序卸载感到不好吗?这是设计上的,因为应用程序池将定期回收(了解设置),ASP.NET也会重新启动,我不确定“感觉不好”是什么意思。当应用程序卸载我的“finally”块时,不会被调用。这是一种CLR行为,并非真正的ASP.NET行为,尽管如我所说,它更可能在IIS中表现出来。好吧,所有的.NET开发人员都必须适应这样一个事实,即不能确保调用终结器。因此,单独在ASP.NET中解决互操作问题并不容易。在ASP.NET模型中,无法控制由ASP.NET/IIS管理的对象的生命周期。但是,将该部分移动到Windows服务应用程序应该可以让您更好地控制对象生命周期。