就在最近,我在采访中遇到了这样一个问题
方法“计算”执行的输出将是什么:
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时,我们将处理另一个线程集合。有人可以详细解释为什么会引发异常吗?
提前致谢!
最佳答案
threads
是IEnumerable,而不是列表,枚举threads
会调用
var thread = new Thread(DoWork)
{
Name = x.ToString()
};
return thread;
lambda 50次,从而创建了全新的线程。
如果您想将IEnumerable提炼为50个线程的具体列表,则需要调用
var listOfThreads = threads.ToList();
然后使用listOfThreads
关于c# - ThreadStateException : Thread has not been started when trying to join a thread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19793975/