5

就在最近我在面试时遇到了这样一个问题

方法“计算”执行的输出是什么:

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 中检查了它,并惊讶地发现 ThreadStateException 在“thread.Join();”行上被抛出。使用调试器我发现线程没有启动。似乎当我们通过第二个 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 回答