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

本文关键字:服务 呼叫 正确处理 插件 确保 | 更新日期: 2023-09-27 18:11:31

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

 base.Dispose(true);

在用户控件上。现在,当这使得插件所在的窗口消失时,我注意到我的服务调用继续进行,并返回到代码中,就好像服务没有被正确处理一样。

是否有一种正确的方法来处理插件,以确保所有的服务调用等被处理?

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

在不知道你正在使用什么类型的"插件"的情况下,这里有几个指针:

  1. 尝试使用。net CancellationToken或其他方法来取消操作,或者在这种情况下,在从服务调用返回时,指示不要继续
  2. 将插件托管在单独的。net AppDomains中。然后当你调用AppDomain。卸载它会立即删除AppDomain和其中的所有内容。当您想要"删除"某些东西而不用担心"哦,它已经被垃圾收集了吗"或记住调用Dispose时,这是非常有用的。这很可能取决于您使用的通信选择,以卸载AppDomain托管服务调用的效果。
  3. 处理插件
  4. 调用 AppDomain.Unload ()

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

自从那篇文章写完后,微软创建了Managed Addin Framework (MAF)。MAF支持AppDomains

你也可以使用异步服务方法,使它更容易取消

编辑:AppDomains的圣经;如何使用;如何在另一个AppDomain内创建和与对象通信,可以在MSDN文章中找到<发现使用。net框架2.0安全托管不受信任的加载项的技术,MSDN杂志,2005年11月>

MSDN杂志存档更新

微软已经从他们的网站上删除了旧的MSDN杂志直接观看文章。

注意:2008及以前的版本只能以。chm文件的形式提供。在大多数版本的windows中,您必须首先将这些文件保存到本地机器,然后解除对文件的阻塞才能读取它。要解除对文件的封锁,右键单击文件,选择属性,然后选择"解除封锁"按钮。然后内容将可以阅读-告诉我更多