【发布时间】:2011-05-21 11:25:33
【问题描述】:
我正在托管 WCF 服务,其要求是调用不直接引用 WCF 服务的类型的对象并在其上运行一些(常用)方法。所以类型是通过反射和AssemblyResolve创建的:这没问题。
但后来我想到 - 我们预计可能会有 50 到 100 个这些程序集/类型到达,尤其是在我们对它们进行版本控制时。由于所有这些程序集都在 mem 中被引用,这可能会导致服务主机应用程序的内存和性能膨胀(这里仍然是理论而不是实践)。
那么我们应该卸载:但唯一的方法是通过应用程序域。想法是,每个程序集都会以某种方式在它自己的 appdomain 中运行,而 WCF 服务实际上只是将消息传递给适当的 appdomain。如果 appdomain 在 some_period_of_time 内没有被使用,那么我们只需卸载 appdomain。
我可能会因此而被扣分,但一些指导会在以下方面有用:
- 这是一个疯狂的想法吗?
- 如果内存中有大约 100 个程序集,该进程应该可以正常运行吗?
- 与 appdomains 的通信可能需要付出一些代价(通过远程处理/命名管道):这是否会取消这个想法?
- 创建一个 appdomain 以基本上服务于一种类型的 .dll 将涉及许多 appdomains,这是迟钝的吗?
我在这方面没有经验。如果我不做这样的事情,我担心的是应用程序的大小和性能。但是,对于应用程序域的想法,这基本上听起来像是大规模的过度工程。托管这个未知 .dll 的要求是我无法改变的。
我想我的总体问题是:
这个想法是否像听起来那样愚蠢,与它相关的利弊是什么?
【问题讨论】:
标签: c# performance reflection appdomain