■No13480 (モー さん) に返信
>
> なちゃ さんのおっしゃっているのはAbort()自体に信頼性がない不確実なメソッドだということですか?
確実にスレッドを殺すというのは,実装上非常に難しい問題で,残念ながら CLR はその難しさを完全に隠蔽してくれてはいません.
結果として Abort の信頼性は著しく低いです.
「using 構文使用時に Dispose が呼出されない確率」
http://d.hatena.ne.jp/NyaRuRu/20060605/p1
「finally 句と ThreadAbort」
http://d.hatena.ne.jp/NyaRuRu/20060531/p1
「ThreadAbort と EscalationPolicy」
http://d.hatena.ne.jp/NyaRuRu/20060602/p1
以下のコードは .NET 1.x と 2.x で挙動が異なり,かつ 2.x では永遠に停止しません.
using System;
using System.Threading;
namespace ThreadAbortTest
{
class Program
{
static void Proc()
{
try
{
try
{
}
finally
{
Thread.Sleep(Timeout.Infinite);
}
}
catch (Exception e)
{
Console.WriteLine("Exception " + e.ToString());
throw;
}
}
static void Main(string[] args)
{
Thread worker = new Thread( new ThreadStart(Proc) );
worker.Name = "Worker Thread";
worker.Start();
Thread.Sleep(1000);
worker.Abort(); // ← ここで無限に停止する (.NET Framework 2.0)
worker.Join(1000);
Console.WriteLine("Joined");
}
}
}
|