ThreadStateException:尝试加入线程时尚未启动Thread

时间:2013-11-05 16:32:31

标签: c# multithreading

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

methid'计算'执行的输出是什么:

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。使用调试器我发现该线程未启动。 似乎当我们经历第二个foreach时,我们处理另一个线程集合。任何人都可以详细解释为什么抛出异常?

提前致谢!

1 个答案:

答案 0 :(得分:7)

threads是一个IEnumerable,而不是一个列表,枚举threads调用

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

lambda 50次,从而创建全新的Threads。

如果你想将IEnumerable提取到50个线程的具体列表,你需要调用

var listOfThreads = threads.ToList();

然后使用listOfThreads