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