Thread.Abort和App崩溃

时间:2013-12-19 05:47:47

标签: .net multithreading clr finalize

所有 我发现我的程序很奇怪

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中的fisrt代码行,打印出'System.Data.SqlTypes.SqlInt32'类型,程序将在退出时崩溃,并且窗口事件告诉我'访问冲突'(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上的.NET 4.0或者胜利7.对于其他版本的.NET,如3.5或4.5,或者像Windows XP这样的操作系统,它会终止通常

提前谢谢!

0 个答案:

没有答案