0

簡単なコンソール アプリケーションを書きましょう。

    static void Main(string[] args)
    {
        IList<Thread> threads = new List<Thread>();
        Console.WriteLine((Process.GetCurrentProcess().Threads).OfType<ProcessThread>().Where(thread => thread.ThreadState == ThreadState.Wait).Count());
        for(int i=0;i<30;i++)
        {
            Thread t = new Thread(Test);
            Console.WriteLine("Before start: {0}", (Process.GetCurrentProcess().Threads).OfType<ProcessThread>().Where(thread => thread.ThreadState == ThreadState.Wait).Count());
            t.Start();
            Console.WriteLine("After start: {0}", (Process.GetCurrentProcess().Threads).OfType<ProcessThread>().Where(thread => thread.ThreadState == ThreadState.Wait).Count());
        }
        Console.WriteLine((Process.GetCurrentProcess().Threads).OfType<ProcessThread>().Where(thread => thread.ThreadState == ThreadState.Wait).Count());
        Console.ReadKey();
    }

    static void Test()
    {
        Thread.Sleep(0);
    }

ご覧のとおり、プロセスで 30 の待機スレッドを作成しました。彼らはどこにいますか?MSDN:

ProcessThread を使用して、現在のプロセスに関連付けられているすべてのスレッドを取得します。

4

1 に答える 1

2

スレッドはすぐに終了します。Sleep(0) は永久にスリープするわけではありません。単なる利回りです。他に実行可能なスレッドがない場合、Sleep(0) の呼び出しは、タイムスライスを生成せずに単に戻ります。Sleep の呼び出しの直後にスレッドが終了します。

これをテストするには、より長い Sleep() を実行します。

于 2012-06-26T23:46:21.283 に答える