1

このテストプログラムを作成して、タイマーコールバックスレッドが戻ったが、新しく作成されたスレッドがまだ実行されている場合に何が起こるかを調べました。timer_Elapsedが戻ったときにローカルスレッド変数がスコープ内にないはずですが、以下に「InWork」が10回表示されます。スレッドの「IsBackground」プロパティをtrueに設定しても効果はありませんでした。

GCがまだ実行されていないため、これが発生していますか?したがって、GCはいつでも実行されてスレッドがクリーンアップされる可能性があるため、この方法で作成されたスレッドが完了すると想定するのは危険ですか?

これはばかげた例だと思いますが、私はここで何が起こっているのかを理解することに主に興味があるので、避けるべきことを知っています。ありがとう!

public class Program
{
    static void Main(string[] args)
    {
        var timer = new Timer(500);
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.AutoReset = false;
        timer.Start();
        Console.ReadLine();
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("In timer elapsed.  Kicking off a thread in new local thread and then immediately exiting.");
        var thread = new Thread(Work);
        thread.Start(); // but...this doesn't stop when the current thread exits!  
        Console.WriteLine("About to exit timer elapsed.");
    }

    static void Work()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("In Work");
            Thread.Sleep(1000);
        }
    }
}
4

2 に答える 2

3

実行中のスレッドは、それ自体への参照を保持します。GCは、他の場所でスコープ外になったスレッドを終了することはありません。

于 2012-05-23T16:12:09.960 に答える
2

MSDNによると、スレッドが開始されると、Threadオブジェクトへの参照を保持する必要はありません。

于 2012-05-23T16:14:52.423 に答える