首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#究竟什么是应用程序域?

C#究竟什么是应用程序域?
EN

Stack Overflow用户
提问于 2018-06-09 04:33:32
回答 2查看 1.3K关注 0票数 1

我知道应用程序域的形式是:

用于托管代码的安全性、版本控制、可靠性和卸载的隔离边界,

但是一个过程也是如此

  1. 有人能帮我理解应用程序域的实际好处吗?
  2. 我假设应用程序域提供了一个容器来加载一个版本的程序集,但最近我发现一个应用程序域中可以加载多个版本的强密钥程序集。

我对应用领域的概念还不是很清楚。我正在努力理解为什么在存在过程概念的情况下实现了这个概念。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-06-09 05:29:47

我不知道你是在泛指.NET的AppDomain,还是具体说.NET的.NET。

我将假设.NET的AppDomain,以及为什么当您需要在单个进程中进行隔离时,它会非常有用。

为例:

假设您正在处理一个包含某些worker类的库,您别无选择,只能使用这些worker,并且不能修改代码。您的工作是构建一个Windows服务来管理上述工作程序,并确保它们都保持正常运行,并且需要并行工作。

很简单,对吧?好吧,你希望如此。事实证明,您的worker库很容易抛出异常,使用static配置,并且通常只是一个真正的PITA。

您可以尝试在它们自己的进程中启动它们,但要监视它们,您需要实现命名管道,或者尝试仔细地解析进程的STDIN和STDOUT。

你还能做什么?嗯,AppDomain实际上解决了这个问题。我可以为每个worker生成一个AppDomain,为它们提供自己的配置,它们不会因为更改static属性而搞砸彼此,因为它们是独立的,最重要的是,如果库崩溃,而我未能捕捉到异常,它不会干扰它们域中的worker。在所有这些过程中,我仍然可以很容易地与这些员工进行交流。

可悲的是,我以前也这样做过。

编辑:开始将此作为注释响应写入,但变得太大

单独的流程在许多情况下都可以很好地工作,然而,有时它们可能会成为一种痛苦。我并不是说一个人应该在另一个进程上使用AppDomain。我认为你需要一个单独的进程或AppDomain是不常见的,但是一旦你需要它,你肯定会知道的。

我在上面给出的场景中看到的进程的主要问题是,进程有自己的缺陷,使用AppDomain可以更容易地缓解这些缺陷。

进程可能在任何时候变得无赖、变得无响应、崩溃或被终止。

如果您正在管理进程,则需要跟踪进程ID并监视其状态。IPC很棒,但如果需要的话,需要时间来进行适当的通信。

举个例子,假设你的进程就这么死了。你的工作是什么?根据您选择监视的机制,可能是通信线程死了,也可能是工作完成了,而您仍然将其显示为“正在处理”。你的工作是什么?

现在,当您有20个进程,而您的管理应用程序停止运行时,会发生什么情况。你没有任何真实的信息,你只有20个"myprocess.exe“,也许现在必须开始解析命令行参数,看看你实际有哪些工人。显然,有了AppDomain,所有20个都会死掉,但你真的从这个过程中获得了什么吗?然而,您仍然需要编写恢复能力的代码,但是,现在您还必须为您的进程编写所有恢复代码,而不仅仅是解雇工作人员备份。

正如编程中的任何事情一样,有1000种不同的方法可以实现相同的目标。由您决定您认为哪种解决方案最合适。

票数 4
EN

Stack Overflow用户

发布于 2018-06-09 04:54:45

使用应用程序域的一些实际好处:

  • 可以在一个进程中运行多个应用程序域。您还可以停止单个应用程序域,而无需停止整个过程。仅此一项就极大地提高了服务器的可伸缩性。
  • 管理应用程序域生命周期由运行时主机以编程方式完成(您也可以覆盖它)。对于进程和线程,必须显式地管理它们的生命周期。初始化、执行、终止、进程间/多线程通信都很复杂,这就是为什么将其交给CLR管理更容易的原因。

来源:https://docs.microsoft.com/en-us/dotnet/framework/app-domains/application-domains

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档