簡體   English   中英

停止執行直到在for循環中創建的所有線程都終止C#

[英]Stop Execution utill all threads created in a for loop are terminated C#

我正在使用線程保存一些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循環中啟動的所有線程都已完成執行。

這看起來像是Parallel.ForEach的工作https://msdn.microsoft.com/zh-cn/library/dd460720(v=vs.110).aspx

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

這是您如何限制線程數: 如何限制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();
}    

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

如果要壓縮/下載主線程中的文件,則可以使用Thread.Join()方法加入所有子線程。 在這種情況下,主線程將等待,直到所有其他線程完成。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM