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

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

什么是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时,我们处理另一个线程集合。 任何人都可以详细解释为什么抛出exception?

提前致谢!

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

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

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

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

 var listOfThreads = threads.ToList(); 

然后使用listOfThreads