- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍在尝试了解持续存在的问题,但它几乎可以概括为无法卸载 AppDomain。
它发生在将 ASP.NET WebAPI 部署到 Azure 应用服务期间,我们观察到以下情况:
"In w3wp_12396.dmp, the HttpRuntime for the application /LM/W3SVC/1523308129/ROOT is in the middle of a shutdown."
分析内存转储时,我们看到设置了 IsAbortRequested 标志的线程,但它们似乎永远不会完成(此处 WinDbg !threads
的输出: https://pastebin.com/7CXYcffy )
在内存转储中,我们还看到许多具有“UNLOAD_REQUESTED”阶段的 AppDomain,它们似乎从未完成卸载(!DumpDomain
的完整输出位于此处:https://pastebin.com/kahZQuWN)
Domain 7: 000001c67062c800LowFrequencyHeap: 000001c67062cff8HighFrequencyHeap: 000001c67062d088StubHeap: 000001c67062d118Stage: UNLOAD_REQUESTEDSecurityDescriptor: 000001c6705c5680Name: /LM/W3SVC/1523308129/ROOT-6-131687140950004974
No deadlocks detected (via WinDbg SOSEX plugin's !dlk
command at least, which usually covers majority of deadlock cases)
No code cancels Thread Abort (no Thread.ResetAbort()
called)
The only way we can fix the problem now is to kill process (stop Azure AppService).
What are the possible reasons for AppDomain's inability to unload?
UPDATE. In the thread stacks we got a hint that it might have something to do with our custom Azure Blob Log4net appender, and I found that when such appender is created (once per app) it spawns new thread with following structure.
while (true)
{
try
{
Flush(); // pseudocode
Thread.Sleep(10000);
}
catch(Exception)
{
}
}
不确定我理解为什么它会导致完全不可停止的线程(因为 ThreadAbortException
不会被 catch 停止),但看起来像是将 while (true)
更改为 while (!Environment.HasShutdownStarted && !_stopping)
解决了问题(调用 Appender OnClose
时设置 _stopping
,这对 log4net 来说是一种优雅的关闭)...
最佳答案
这似乎是一个 JIT 错误。是的,JIT 中的错误!我发现那里记录了几乎相同的故事:http://labs.criteo.com/2017/04/ryujit-never-ending-threadabortexception/ .
为了演示该问题,您可以运行以下代码。仅适用于 Release模式,仅适用于 x64 平台(并且我的目标是 .NET 4.5.2)。
除非您手动重新抛出异常,否则您将观察到记录的异常链。为什么这是 CLR/JIT 中的错误?因为 CLR/JIT 负责在设置线程的 AbortRequested 标志时在“安全位置”注入(inject) throw ThreadAbortException
。
引用 Jeffrey Richter 的“CLR via C#”(以下代码违反了规定):
Even when code catches the
ThreadAbortException
, the CLR doesn’t allow the exception to be swallowed. In other words, at the end of the catch block, the CLR automatically rethrows theThreadAbortException
exception.
还有 GitHub 中的错误:https://github.com/dotnet/coreclr/issues/16122 .
static void Main(string[] args)
{
var mutex = new ManualResetEventSlim();
var t = new Thread(() =>
{
while (true)
{
try
{
if (!mutex.IsSet)
{
mutex.Set();
}
// Do some stuff
Thread.Sleep(100);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
// the lines below FIX the issue
//if (ex is ThreadAbortException)
// throw;
}
// FIXES the issue as well
//Thread.Sleep(0);
}
});
t.Start();
// Wait for the thread to start
mutex.Wait();
t.Abort();
Console.ReadLine();
}
关于.net - AppDomain 卸载卡住的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028901/
我为 ReSharper 编写了 xunit.net 测试运行程序,但在 8.0 版本中遇到了一个问题 - 我看到程序集无法加载到影子复制的 AppDomain 中。相同的代码和测试项目在 7.1 版
我无法弄清楚有关我的 AppDomain.Unload(...) 调用的问题。我有来自 my earlier question 的代码的详细解释.事实证明,我执行了几个显然不需要的步骤。但是,我相当确
我想在应用程序域内运行第三方库(在本例中为 XSP),这样我就可以关闭它或以其他方式控制它的行为。 基本流程: var child = AppDomain.CreateDomain(...) ...
我正在尝试将一个 dll 加载到控制台应用程序中,然后将其卸载并完全删除该文件。我遇到的问题是,在其自己的 AppDomain 中加载 dll 的行为会在父 AppDomain 中创建一个引用,因此除
我的印象是 AppDomains 彼此隔离。似乎在 StackOverException 的情况下,情况并非如此。 为了演示这个问题,我创建了一个简单的控制台应用程序,其唯一目的是生成一个新的 App
我有一个带有服务器“AppDomain”的应用程序,它接受来自单独的 AppDomain 的调用(其中托管插件,由其他人开发且不值得信赖)。 从服务器 AppDomain 中,我需要知道哪个“插件”(
坐: 我正在从我的进程中创建子应用程序域以加载程序集。 我可以调用此 AppDomain。 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain,以接收从加载到新
可能是以下副本:Can I prevent an uncaught exception in another AppDomain from shutting down the application?
我已经在 Specflow 2.0、nUnit 3.X、TeamCity 和 Visual Studio 2013 中编写了自动化测试。我试图并行运行这些测试,但它们失败了,因为代码使用静态类/对象。
我有一个 Bootstrapper,它查看 ASP.NET MVC 应用程序中的所有程序集以查找实现 IBootstrapperTask 接口(interface)的类型,然后将它们注册到 IOC C
我有一个 .NET 应用程序,它创建多个单独的 AppDomain 来运行一些可插入代码,每个 AppDomain 都设置自己的 WCF 命名管道服务来与中央应用程序进行通信。 但是我想为每个应用程序
对于我的项目,我需要从其他 .Net 程序集访问资源,但我不想让它们加载,因为我可能会加载同一程序集的不同版本。 为此,我创建了另一个 AppDomain,我使用 CreateInstanceAndU
我正在使用 AppDomain 来加载程序集然后卸载它们。 但是,我遇到了一个非常奇怪的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被多次加载! 为什么有加载的程
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
是否可以通过它的“友好名称”或 ID 来引用现有的 AppDomain(不是由我的代码创建)?还是以其他方式? 最佳答案 List AppDomains in Process 关于.net - 如何通
我在同一个虚拟目录下有一个网站和一个 web 服务,一些网页调用了 web 服务。 调用 Web 服务时,IIS 是创建新的 AppDomain 还是在同一个 AppDomain 中运行 Web 服务
在 ASP.NET 3.5(带有 IIS6)中,是否为每个请求创建了 AppDomains?我知道所有应用程序在 w3wp.exe 下都有自己的 AppDomain,但是整个 AppDomain 究竟
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
我仍在尝试了解持续存在的问题,但它几乎可以概括为无法卸载 AppDomain。 它发生在将 ASP.NET WebAPI 部署到 Azure 应用服务期间,我们观察到以下情况: 进程 ID 不会更改,
我已经编写了在所有专用服务器上运行的软件(C#.NET控制台应用程序),这些服务器将管理各个Java进程(启动/停止/重新启动它们)。我遇到的问题是,当我的应用程序崩溃时,它不会关闭它启动的Java子
我是一名优秀的程序员,十分优秀!