2

こんにちは、次のテスト コードがあります。

class Program
{
    static void Main(string[] args)
    {
        Thread t = new Thread(Work);
        t.Start();
        Thread.Sleep(1000);
        t.Abort();
        Thread.Sleep(1000);
        t.Abort();
        Thread.Sleep(1000);
        t.Abort();
        t.Join();
        Console.WriteLine("End");
    }

    static void Work()
    {
        int i = 0;
        while (i<10)
        {
            try
            {
                while(true);
            }
            catch(ThreadAbortException)
            {
                Thread.ResetAbort();
            }

            Console.WriteLine("I will come back!");
            i++;
        }
    }
}

毎回、中止が発生すると、 Thread.ResetAbort() が実行されます。この ResetAbort は何をするのだろうか。実行すると、次の出力が表示されたからです。I will come back! 戻ってきます!戻ってきます!そして、出力「End」が表示されませんでした。このプログラムはまったく終了していないようです。なぜなのかご存知ですか?ありがとう!

4

3 に答える 3

3

スレッドを中止する要求をキャンセルします。ここに示されているとおりです。したがって、この場合、ループは継続し、スレッドはまだ生きているはずです。

于 2011-05-11T18:50:40.243 に答える
1

他の人の答えResetAbortは正しいです。「End」が出力されないのは、t.Join()二度と戻らないからです。これは、スレッドが3回だけ中止され、ループに無限ループでの10回の試行が含まれているためです。 Joinターゲットスレッドがデリゲートの実行を完了し、あなたのスレッドが完了しない場合に戻ります。

于 2011-05-11T18:56:35.460 に答える
0

ResetAborts は、スレッドの中止要求をキャンセルします

于 2011-05-11T18:51:27.573 に答える