我正在使用线程保存一些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循环中启动的线程都已完成执行
答案 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
代替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());
答案 2 :(得分:0)
如果您在主线程中压缩/下载文件,则可以使用Thread.Join()
方法加入所有子线程。在这种情况下,主线程将等待所有其他线程完成。
foreach (var f in Files)
{
string tFile = f.ToString();
Thread myThread = new Thread(() => SaveCSVFile(BulkExtractFolder, tFile));
myThread.Start();
myThread.Join();
}