C#究竟是什么应用领域?

时间:2018-06-08 20:33:32

标签: c# .net multithreading clr

我了解申请域形成:

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

但过程也是如此

  1. 有人可以帮我理解应用程序域的实际好处吗?
  2. 我假设app域为您提供了一个容器来加载一个版本的程序集,但最近我发现可以在app域中加载多个版本的强密钥程序集。
  3. 我的应用领域概念尚不清楚。我正在努力理解为什么在进程的概念存在时实施这个概念。

    谢谢。

2 个答案:

答案 0 :(得分:2)

我无法判断你是在谈论一般情况还是特别是.NET AppDomain

我将假设.NET AppDomain以及为什么当您需要在单个进程内部进行隔离时它才真正有用。

例如:
假设您正在处理具有某些工作类的库,您没有选择权,但是要使用这些工作者并且无法修改代码。建立一个管理所述工作人员的Windows 服务是您的工作,并确保他们都能保持运行并且需要并行工作。

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

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

你还能做什么?那么AppDomain实际上解决了这个问题。我可以为每个工作者生成一个AppDomain,给他们自己的配置,他们不能通过更改static属性来互相攻击,因为它们是孤立的,而且最重要的是,如果库被炸出来并且我没有抓住异常,它并没有打扰他们领域的工人。在所有这些过程中,我仍然可以轻松地与这些工作人员进行沟通。

可悲的是,我必须在

之前这样做

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

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

我在上面给出的方案中看到的主要问题是流程有自己的缺点,使用AppDomain更容易缓解。

流程可能变得流氓,变得反应迟钝,崩溃或在任何时候被杀死。

如果您正在管理流程,则需要跟踪流程ID并监控流程ID的状态。 IPC非常棒,但需要时间来根据需要来回进行适当的沟通。

作为一个例子,让我们说你的过程就好了。你是做什么?根据您选择监控的机制,也许通信线程已经死亡,也许工作已经完成,您仍然会将其显示为"处理"。你是做什么?

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

与编程中的任何内容一样,有1,000种不同的方法可以实现相同的目标。由您来决定您认为哪种解决方案最合适。

答案 1 :(得分:0)

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

  • 可以在一个过程中运行多个应用程序域。您还可以停止单个应用程序域,而无需停止整个过程。仅这一点就大大提高了服务器的可扩展性。

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

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