C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 29 を表示中)
■13488 / )  Re[9]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ NyaRuRu (31回)-(2008/01/30(Wed) 09:33:08)
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");
        }
    }
}

返信 編集キー/


管理者用

- Child Tree -