【发布时间】:2013-11-06 00:37:17
【问题描述】:
最近在面试中遇到这样的问题
methid 'Calculate' 执行的输出是什么:
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 时,我们处理了另一个线程集合。谁能详细解释一下为什么会抛出异常?
提前致谢!
【问题讨论】:
-
您几乎肯定不想创建 50 个实际线程。这将产生比您想要的更多的开销。相反,您应该向线程池添加 50 个任务,以大大减少开销。也可以改用
Tasks,默认使用线程池,更方便
标签: c# multithreading