就在最近,我在采访中遇到了这样一个问题

方法“计算”执行的输出将是什么:

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/

10-13 07:47
查看更多