停止执行直到for循环中创建的所有线程都被终止C#

时间:2016-01-15 12:59:48

标签: c# asp.net multithreading

我正在使用线程保存一些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循环中启动的线程都已完成执行

3 个答案:

答案 0 :(得分: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();
}    

答案 1 :(得分:0)

如果您使用的是.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());

答案 2 :(得分:0)

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

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