【问题标题】:Block Main Thread While Other Threads in Foreach Loop are Running在 Foreach 循环中的其他线程正在运行时阻塞主线程
【发布时间】:2013-01-02 21:39:30
【问题描述】:

我正在创建一个新线程以在 foreach 循环的每次迭代期间执行一些代码。这些线程完成后,我希望主线程继续执行,但是我不知道该怎么做。我不能为每次迭代调用Thread.Join(),因为这将阻止主线程继续 foreach 循环,直到创建的线程完成。这是代码块,其中testEnvironments 是一个字符串类型的列表:

        foreach (string s in testEnvironments)
        {
            myThread = new Thread(() => program.KickoffPricing(s));
            myThread.Start();
            Thread.Sleep(1000);
        }

        email.ComposeEmail();

【问题讨论】:

  • 我希望这不是 UI 线程。
  • 这不是 UI 线程。这是一个控制台应用程序。
  • 您是否要同时运行所有线程?或者你想运行一个线程,等待,然后运行另一个线程?如果是后者,这真的需要在单独的线程上吗?
  • 我想同时运行每个线程,然后在所有线程都完成后调用 ComposeEmail 方法。
  • 然后根据您使用的 .Net/C# 版本,SLaks 建议的方法会很好。如果这些构造不可用,则可以使用 ManualResetEvent 对象的集合。

标签: c# multithreading


【解决方案1】:

您需要将所有Threads 存储在List<Thread> 中,并在启动所有Join()s 后创建一个单独的foreach 循环。

请注意,您可以使用Task 而不是Thread,或者更好的是Parallel.ForEach(),使您的代码更简单、更高效。

【讨论】:

  • Parallel.ForEach 循环运行良好。如果我为在该循环中创建的线程创建一个列表,那么您将如何在不阻塞调用线程(主应用程序线程)的情况下调用 Thread.Join?似乎当您调用 Thread.Join 时,它会阻止 foreach 循环运行。
  • 这正是它会做的,一次一个线程。当每个线程完成时,Join 会将控制权返回给 foreach,然后它会与下一个线程重复该过程,直到所有线程都完成。
猜你喜欢
  • 2017-01-10
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多