AppDomain 是不是在自己的线程中执行?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

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

来自AppDomain documentation

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

" 如果一个应用域创建另一个新的应用域,那么新的应用域将拥有它自己的线程。"。虽然我不是反对者,但该声明与实际发生的情况有所不同。当您创建另一个 AppDomain 时,它将在当前线程中执行。如果您想在自己的线程中运行 AppDomain,则必须专门创建一个新线程并在该线程中创建和启动新的 AppDomain。

以上是关于AppDomain 是不是在自己的线程中执行?的主要内容,如果未能解决你的问题,请参考以下文章

添加当前 AppDomain 的路径

关于进程线程应用程序域(AppDomain)

IIS 中是不是需要 AppDomain?

AppDomain 是不是等同于 .NET 代码的进程?

如何使用 AppDomain 限制静态类的范围以进行线程安全使用?

在 AppDomain 中启动 .NET 进程