5

つい最近、面接でそのような質問に直面しました

メソッド 'Calculate' の実行結果は次のようになります。

public void Calculate()
    {
        var threads = Enumerable.Range(0, 50).Select(x =>
        {
            var thread = new Thread(DoWork)
            {
                Name = x.ToString()
            };
            return thread;
        });
        foreach (var thread in threads)
        {
            thread.Start();

        }
        foreach (var thread in threads)
        {
            thread.Join();
        }
    }

    private void DoWork()
    {
        Console.WriteLine("Start()");
    }

VS で確認したところ、「thread.Join();」行で ThreadStateException がスローされることに驚きました。デバッガーを使用して、スレッドが開始されていないことがわかりました。2 番目の foreach を実行すると、別のスレッドのコレクションを処理しているようです。例外がスローされる理由を詳しく説明してください。

前もって感謝します!

4

1 に答える 1

8

threadsリストではなくIEnumerableであり、列挙threads呼び出しは

var thread = new Thread(DoWork)
{
   Name = x.ToString()
};
return thread;

lambda を 50 回繰り返して、まったく新しいスレッドを作成します。

IEnumerable を 50 スレッドの具体的なリストに絞り込みたい場合は、次のように呼び出す必要があります。

var listOfThreads = threads.ToList();

次に listOfThreads を使用します

于 2013-11-05T16:37:17.077 に答える