我有一个长期运行的.NET 4.5应用程序随机崩溃,留下我在事件日志中的问题标题中提到的消息.该问题在3种不同的机器和2种不同的系统上重现(2008 R2和2012).应用程序不使用任何不安全/非托管组件,它是纯托管.NET,唯一不受管理的东西是CLR本身.
这是我从转储中提取的崩溃站点的堆栈跟踪:
clr.dll!MethodTable::GetCanonicalMethodTable()
clr.dll!SVR::CFinalize::ScanForFinalization() - 0x1a31b bytes
clr.dll!SVR::gc_heap::mark_phase() + 0x328 bytes
clr.dll!SVR::gc_heap::gc1() + 0x95 bytes
clr.dll!SVR::gc_heap::garbage_collect() + 0x16e bytes
clr.dll!SVR::gc_heap::gc_thread_function() + 0x3e bytes
clr.dll!SVR::gc_heap::gc_thread_stub() + 0x77 bytes
kernel32.dll!BaseThreadInitThunk() + 0x1a bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
Run Code Online (Sandbox Code Playgroud)
这个问题与这里讨论的问题非常相似,所以我尝试了该主题中提出的解决方案,但没有一个帮助:
我已经尝试安装此修补程序,但它不会安装在我的任何机器上(KB2640103不适用,或被计算机上的其他条件阻止),这实际上是有道理的,因为我使用的是4.5,而不是4.0 .
我已经尝试禁用并发GC和/或启用服务器GC.现在我的app.config的相关部分如下所示:
<?xml version="1.0"?>
<configuration>
<runtime>
<gcConcurrent enabled="false"/>
<gcServer enabled="true" />
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup></configuration>
Run Code Online (Sandbox Code Playgroud)虽然奇怪的是我仍然在进程转储中找到多个与GC相关的线程.除了发生崩溃之外,还有7个线程具有以下堆栈跟踪:
ntdll.dll!NtWaitForSingleObject() + 0xa bytes
KERNELBASE.dll!WaitForSingleObjectEx() + 0x9a bytes
clr.dll!CLREventBase::WaitEx() + 0x13f bytes
clr.dll!CLREventBase::WaitEx() + 0xf7 bytes
clr.dll!CLREventBase::WaitEx() + 0x78 bytes …Run Code Online (Sandbox Code Playgroud) 在GetHashCode()为匿名类生成实现时,Roslyn根据属性名称计算初始哈希值.例如,为其生成的类
var x = new { Int = 42, Text = "42" };
Run Code Online (Sandbox Code Playgroud)
将有以下GetHashCode()方法:
public override in GetHashCode()
{
int hash = 339055328;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int );
hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode( Text );
return hash;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我们更改属性名称,则初始值会更改:
var x = new { Int2 = 42, Text2 = "42" };
public override in GetHashCode()
{
int hash = 605502342;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int2 );
hash …Run Code Online (Sandbox Code Playgroud)