【问题标题】:C# What exactly is application domain?C# 究竟什么是应用程序域?
【发布时间】:2018-06-08 20:33:31
【问题描述】:

我了解应用程序域的形式:

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

但过程也是如此

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

我对应用领域的概念还不是很清楚。而且我很难理解为什么在过程概念出现时会实施这个概念。

谢谢。

【问题讨论】:

  • fwiw 线程不会隔离太多。
  • 谢谢你是对的。我已经编辑并删除了该行。我想我想了解何时应该创建流程与应用程序域?什么时候需要应用程序域?

标签: c# .net multithreading clr


【解决方案1】:

我不知道您是在谈论一般性还是专门谈论 .NET 的 AppDomain

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

例如:
假设您正在处理具有某些工作人员类的库,您别无选择,只能使用这些工作人员并且无法修改代码。您的工作是构建一个 Windows Service 来管理上述工作人员并确保他们都保持正常运行并需要并行工作。

够简单吧?嗯,你希望。事实证明,您的工作库容易抛出异常,使用 static 配置,通常只是一个真正的 PITA。

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

你还能做什么?好吧AppDomain 实际上解决了这个问题。我可以为每个工作人员生成一个 AppDomain,给他们自己的配置,他们不能通过更改 static 属性来搞砸彼此,因为它们是隔离的,最重要的是,如果库爆炸而我没能抓住例外情况是,它不会打扰他们所在领域的工作人员。在这一切过程中,我仍然可以轻松地与那些工人交流。

很遗憾,我之前不得不这样做

编辑:开始将其写为评论回复,但太大了

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

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

一个进程可以在任何时候变得流氓、变得无响应、崩溃或被杀死。

如果您要管理进程,则需要跟踪进程 ID 并监控它的状态。 IPC 很棒,但需要时间来根据需要来回进行适当的通信。

例如,假设您的进程刚刚终止。你做什么工作?根据您选择监视的机制,可能通信线程已终止,可能工作已完成,您仍将其显示为“正在处理”。你做什么工作?

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

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

【讨论】:

  • 感谢您的回答。我猜多线程不好,因为静态可变属性,但是对于这个用例,编写包装器/适配器代码,创建新进程,在自己的沙箱中加载这个库并执行任务不是更好/更容易吗?完成后,可以通过包装代码编写通信(例如来自库的响应)。还是我错了?我的意思是,为什么要考虑应用程序域?
  • @InfoLearner 更新了答案。希望这能回答你的问题。我只是想确保我清楚我不是在提倡一种或另一种方式,但在某些情况下,AppDomain 可能比进程更好。当然,这取决于他们在做什么,并且在其他情况下流程可能会更好。我现在要去喝醉了。星期五快乐!
【解决方案2】:

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

  • 多个应用程序域可以在一个进程中运行。您还可以在不停止整个过程的情况下停止单个应用程序域。仅此一项就极大地提高了服务器的可扩展性。

  • 管理应用程序域生命周期由运行时主机以编程方式完成(您也可以覆盖它)。对于进程和线程,您必须明确管理它们的生命周期。初始化、执行、终止、进程间/多线程通信很复杂,这就是为什么将其推迟到 CLR 管理更容易的原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2021-10-16
    • 2018-08-09
    • 2012-05-17
    • 2015-06-12
    • 2014-10-28
    • 2012-08-27
    相关资源
    最近更新 更多