[英]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
而不是Thread
和WaitAll
方法。
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.