0

私のプログラムで奇妙なものを見つけました

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();
      }
  }

このプログラムは正常に終了しますが、 「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 上の .NET 4.0、または win 7 でのみ発生します。3.5 や 4.5 などの他のバージョンの .NET、または Windows XP などの OS では、正常に終了します。

前もって感謝します!

4

0 に答える 0