【问题标题】:ThreadStateException: Thread has not been started when trying to join a threadThreadStateException:尝试加入线程时线程尚未启动
【发布时间】: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


【解决方案1】:

threads 是一个 IEnumerable,而不是列表,枚举 threads 调用

var thread = new Thread(DoWork)
{
   Name = x.ToString()
};
return thread;

lambda 50 次,从而创建全新的线程。

如果您想将 IEnumerable 提炼成 50 个线程的具体列表,您需要调用

var listOfThreads = threads.ToList();

然后使用 listOfThreads

【讨论】:

  • +1。哦,延迟执行可能会让粗心大意的人绊倒。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2019-04-30
相关资源
最近更新 更多