【问题标题】:Do AppDomains execute in their own threads ?AppDomain 是否在自己的线程中执行?
【发布时间】:2010-03-05 16:42:05
【问题描述】:

如果我运行这段代码,每个AppDomain 会在不同的线程中执行吗?

 ThreadPool.QueueUserWorkItem(delegate
 {
     /// Create AppDomain and run code
 });

【问题讨论】:

    标签: c# multithreading appdomain


    【解决方案1】:

    默认情况下,AppDomain 没有自己的线程。您可以使用现有线程在另一个 AppDomain 中执行代码,或者调用 AppDomain 中的方法来创建新线程。实际上,除非您专门创建额外的线程,否则调用另一个域中的代码将在进程的主线程上执行。

    来自AppDomain documentation

    可以运行多个应用程序域 在一个过程中;然而,有 之间不是一一对应的 应用程序域和线程。 多个线程可以属于一个 应用程序域,而给定的 线程不限于单个 应用程序域,在任何给定时间, 一个线程在单个中执行 应用领域。

    在您的示例中,您创建线程(或者更具体地说是线程池创建线程),因此代码将在这些线程上运行。但是,我不确定我是否会推荐在这样的线程池线程上创建 AppDomains。

    卸载 AppDomain 将中止 AppDomain 中的所有线程。老实说,我不知道线程池对此有何反应。更多关于卸载here的信息。

    【讨论】:

      【解决方案2】:

      App Domain 比线程大,但比进程小。您可以将它们视为多个线程的潜在集合。如果一个 App Domain 创建另一个新的 App Domain,则新的 App Domain 将拥有自己的线程。一个应用域中的线程永远不会同时属于另一个应用域,也不允许直接与其他应用域中的线程对话。

      【讨论】:

      • " 如果一个应用域创建另一个新的应用域,那么新的应用域将拥有它自己的线程。"。虽然我不是反对者,但该声明与实际发生的情况有所不同。当您创建另一个 AppDomain 时,它将在当前线程中执行。如果您想在自己的线程中运行 AppDomain,则必须专门创建一个新线程并在该线程中创建和启动新的 AppDomain。
      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多