C# 在Foreach循环中的其他线程运行时阻止主线程
我正在创建一个新线程,以便在foreach循环的每次迭代期间执行一些代码。在这些线程完成后,我希望主线程继续执行,但是我不确定如何执行。我不能为每次迭代调用C# 在Foreach循环中的其他线程运行时阻止主线程,c#,multithreading,C#,Multithreading,我正在创建一个新线程,以便在foreach循环的每次迭代期间执行一些代码。在这些线程完成后,我希望主线程继续执行,但是我不确定如何执行。我不能为每次迭代调用Thread.Join(),因为这将阻止主线程继续foreach循环,直到创建的线程完成。这是代码块,其中testEnvironments是类型字符串的列表: foreach (string s in testEnvironments) { myThread = new Thread((
Thread.Join()
,因为这将阻止主线程继续foreach循环,直到创建的线程完成。这是代码块,其中testEnvironments
是类型字符串的列表:
foreach (string s in testEnvironments)
{
myThread = new Thread(() => program.KickoffPricing(s));
myThread.Start();
Thread.Sleep(1000);
}
email.ComposeEmail();
您需要将所有
线程
存储在列表
中,并在启动所有线程后为每个线程创建一个单独的foreach
循环
请注意,通过使用
任务而不是线程,或者更好的方法是使用并行.ForEach()
,可以使代码更简单、更高效。您需要将所有线程存储在列表中,并为每个线程创建一个单独的循环连接()
s在您启动所有这些功能后,再重新启动它们
请注意,您可以使用Task
而不是Thread
,或者更好的方法是使用Parallel.ForEach()
使代码更简单、更高效。我希望这不是UI线程。它不是UI线程。这是一个控制台应用程序。是否要同时运行所有线程?还是要运行一个线程,等待,然后运行另一个线程?如果是后者,这真的需要在一个单独的线程上吗?我想并发运行每个线程,然后在所有线程都完成后调用ComposeEmail方法。然后,根据您使用的.Net/C版本,SLaks建议的方法是好的。如果这些构造不可用,那么可以选择一组ManualResetEvent
对象。我希望这不是一个UI线程。它不是一个UI线程。这是一个控制台应用程序。是否要同时运行所有线程?还是要运行一个线程,等待,然后运行另一个线程?如果是后者,这真的需要在一个单独的线程上吗?我想并发运行每个线程,然后在所有线程都完成后调用ComposeEmail方法。然后,根据您使用的.Net/C版本,SLaks建议的方法是好的。如果这些构造不可用,那么可以选择一组ManualResetEvent
对象。Parallel.ForEach循环工作得很好。如果我为在该循环中创建的线程创建一个列表,那么您如何能够调用Thread.Join而不阻塞调用线程(主应用程序线程)?好像当你调用线程时。加入它会阻止foreach循环运行。这正是它要做的,一次一个线程。当每个线程完成时,Join将控制权返回给foreach,然后foreach对下一个线程重复该过程,直到所有线程都完成。Parallel.foreach循环工作得很好。如果我为在该循环中创建的线程创建一个列表,那么您如何能够调用Thread.Join而不阻塞调用线程(主应用程序线程)?好像当你调用线程时。加入它会阻止foreach循环运行。这正是它要做的,一次一个线程。当每个线程完成时,Join将控制权返回给foreach,foreach然后对下一个线程重复该过程,直到所有线程都完成。