如何正确处理插件,确保所有打开的服务调用都已关闭

时间:2014-07-04 11:22:00

标签: c# wcf plugins

我目前有一个使用基本外接程序模型的插件。 (使用共享库中定义的接口并使用Activator.CreateInstance创建插件的实例)但不确定如何处理它以确保所有打开的服务调用都已关闭。目前,如果我点击插件上的关闭按钮,我会调用

 base.Dispose(true);

关于用户控件。现在虽然这使得插件被托管的窗口消失了但我注意到我的服务调用继续进行并返回到代码中,就好像服务没有被正确处理一样。

是否有正确的方法来处理插件,确保所有服务电话等都被处理掉?

1 个答案:

答案 0 :(得分:2)

如果不确切知道您在这里使用的“插件”类型,请参阅以下几点:

  1. 尝试使用.NET CancellationToken 或其他一些方法来取消操作,或者在这种情况下表示从服务电话返回时,不要打扰继续
  2. 将您的插件托管在单独的.NET AppDomains 中。然后,当您致电AppDomain.Unload时,它会立即删除 AppDomain 及其中的所有内容。当您想要“删除”某些东西时,这非常有用,而不必担心“哦它已被垃圾收集”或记得打电话给 Dispose 。它很可能取决于您正在使用的通信选择,以及卸载在呼叫期间主持服务呼叫的 AppDomain 的效果。
  3. 关闭窗口
  4. 处理插件
  5. 致电 AppDomain.Unload()
  6.   

    这是AppDomain边界增加价值的另一种方式:它可以让您回收系统资源而无需循环流程。   如果主机想立即关闭加载项,则不必担心跟踪哪个加载项属于哪个AppDomain。 .NET应用程序可扩展性,MSDN杂志

    自撰写该文章以来,Microsoft创建了托管加载框架(MAF)。 MAF支持 AppDomains

    您还可以使用异步服务方法,使其更容易取消

    编辑:AppDomains上的圣经;如何使用它;如何在另一个AppDomain中创建对象并与其进行通信可在此MSDN文章中找到 Discover Techniques for Safely Hosting Untrusted Add-Ins with the .NET Framework 2.0, MSDN Magazine, November 2005

    MSDN杂志存档更新

    MS从他们的网站上删除了旧的MSDN Mag直观文章。

      

    注意:2008年及以前的问题仅作为.chm文件提供。在大多数Windows版本中,您必须先将这些文件保存到本地计算机,然后取消阻止该文件以进行读取。要取消阻止文件,请右键单击该文件,然后选择属性,然后选择“取消阻止”按钮。然后,内容将可供阅读 - Tell me more