就在最近,我在面试中遇到了这样一个问题
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时,我们处理另一个线程集合。任何人都可以详细解释为什么抛出异常?
提前致谢!
答案 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