【问题标题】:Stop Execution utill all threads created in a for loop are terminated C#停止执行,直到在 for 循环中创建的所有线程都终止 C#
【发布时间】:2016-01-15 12:59:47
【问题描述】:

我正在使用线程保存一些 csv 文件, 线程是在循环中创建的 这是代码

foreach (var f in Files)
{

   string tFile = f.ToString(); 
   Thread myThread = new Thread(() =>  SaveCSVFile(BulkExtractFolder, tFile));
   myThread.Start();
}

//save folder as zip file and download it

它开始保存 csv 文件,但是当 zip 文件下载时它不包含其中的所有文件,因为当我压缩这个文件夹时,一些线程正在执行,我怎么知道在 for 循环中启动的所有线程都完成了它们的执行.

【问题讨论】:

标签: c# asp.net multithreading


【解决方案1】:

这看起来像是Parallel.ForEach 的工作 https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx

Parallel.ForEach(Files, (f)=> {
   string tFile = f.ToString(); 
   SaveCSVFile(BulkExtractFolder, tFile);
});

以下是限制线程数的方法:How can I limit Parallel.ForEach?

编辑:对于旧版本的 .NET,这将起作用:

var numFiles = Files.Count; //or Files.Length, depending on what Files is
var threads = new Thread[numFiles];
for(int i = 0; i < numFiles; i++)
{
    threads[i] = new Thread(() =>  SaveCSVFile(BulkExtractFolder, Files[i]));
    threads[i].Start();
}
for(int i = 0; i < numFiles; i++)
{
    threads[i].Join();
}    

【讨论】:

  • 我正在开发的应用程序是在 MVC2 中使用 Dot Net 3.5
【解决方案2】:

如果您在主线程中压缩/下载文件,那么您可以使用Thread.Join() 方法加入所有子线程。在这种情况下,主线程将等待,直到所有其他线程都完成。

foreach (var f in Files)
{
   string tFile = f.ToString(); 
   Thread myThread = new Thread(() =>  SaveCSVFile(BulkExtractFolder, tFile));
   myThread.Start();
   myThread.Join();
}

【讨论】:

  • 如果您要在启动线程后立即等待,您不妨在当前线程中完成所有工作。
【解决方案3】:

如果您使用.Net 4 或更高版本,您可以使用Task 代替ThreadWaitAll 方法。

List<Task> tasks = new List<Task>();
foreach (var f in Files)
{
   string tFile = f.ToString(); 
   tasks.add(Task.Factory.StartNew(() =>
        {               
             SaveCSVFile(BulkExtractFolder, tFile)
        });
   );
}

Task.WaitAll(tasks.toArray());

【讨论】:

  • 我正在开发的应用程序是 MVC2 和 Dot Net 3.5
猜你喜欢
  • 2015-07-04
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多