Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Foreach循环中的其他线程运行时阻止主线程_C#_Multithreading - Fatal编程技术网

C# 在Foreach循环中的其他线程运行时阻止主线程

C# 在Foreach循环中的其他线程运行时阻止主线程,c#,multithreading,C#,Multithreading,我正在创建一个新线程,以便在foreach循环的每次迭代期间执行一些代码。在这些线程完成后,我希望主线程继续执行,但是我不确定如何执行。我不能为每次迭代调用Thread.Join(),因为这将阻止主线程继续foreach循环,直到创建的线程完成。这是代码块,其中testEnvironments是类型字符串的列表: foreach (string s in testEnvironments) { myThread = new Thread((

我正在创建一个新线程,以便在foreach循环的每次迭代期间执行一些代码。在这些线程完成后,我希望主线程继续执行,但是我不确定如何执行。我不能为每次迭代调用
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然后对下一个线程重复该过程,直到所有线程都完成。