我发现我的程序有些奇怪
using System;
using System.Data.SqlTypes;
using System.Threading;
namespace TestCrash
{
class Program
{
static void Main(string[] args)
{
/*Console.WriteLine(typeof(SqlInt32));*/
var h = new Holder();
h.Test();
Console.WriteLine("TestHolder");
Console.ReadLine();
}
}
public class Holder
{
private Thread t;
private void Work()
{
Thread.Sleep(Timeout.Infinite);
}
~Holder()
{
t.Abort();
}
public void Test()
{
t = new Thread(new ThreadStart(Work));
t.IsBackground = true;
t.Start();
}
}
该程序正常终止,但是,如果我取消注释 Main 中打印“System.Data.SqlTypes.SqlInt32”类型的第一个代码行,程序将在退出时崩溃,并且 windows 事件告诉我“访问冲突”(0xc0000005 )
Faulting application name: TestCrash.exe, version: 1.0.0.0, time stamp: 0x52b0189a
Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
Exception code: 0xc0000005
Fault offset: 0x00000000000159ad
Faulting process id: 0x1f20
Faulting application start time: 0x01cefb129f0bf5e8
Faulting application path: C:\yuanf\Flx\Source\TestCrash\bin\Debug\TestCrash.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: ddf78d96-6705-11e3-bafd-005056b80090
我发现它与线程中止有关,但是谁能解释为什么在终结器中中止“工作”线程会导致崩溃,而在其他线程中这会很好地工作?
经过一些实验,我发现不是打印'System.Data.SqlTypes.SqlInt32',任何可以引入加载System.Data.dll的代码都会使该程序异常终止。有什么关系?
需要注意的是,根据我的测试,崩溃仅发生在 Windows 2008R2 或 win 7 上的 .NET 4.0 上。对于其他版本的 .NET,如 3.5 或 4.5,或 Windows XP 等操作系统,它会正常终止。
先感谢您!