使用线程池处理文件
Using ThreadPool for processing files
目前我们有一个服务器,文件以每天大约 10,000 个文件(每小时 500 个)的速度保存。
我的程序已经成功地解析了这些文件并将相关信息输入到数据库中。问题是,我的单线程应用程序几乎跟不上步伐,真的落后了。
我想尝试创建一个包含 3-5 个线程的线程池,看看这是否有助于跟上进度。
应用程序查看文件夹并抓取所有文件名,如下所示:
For Each newfile As String In Directory.GetFiles(fileLoc)
Next
我想做的是根据线程是否处于活动状态将每个文件分配给线程池中的一个线程,如下所示:
For Each newfile As String In Directory.GetFiles(fileLoc)
If Not (Thread1.IsAlive) Then
Thread1 = New Threading.Thread(Sub() dowork(arg1, arg2))
ElseIf Not (Thread2.IsAlive) Then
Thread2 = New Threading.Thread(Sub() dowork(arg1, arg2))
ElseIf Not (Thread3.IsAlive) Then
Thread3 = New Threading.Thread(Sub() dowork(arg1, arg2))
End If
Next
我在浏览论坛时发现了一个使用
的教程
System.Threading.ThreadPool.QueueUserWorkItem(Sub() dowork(arg1, arg2))
不确定这是否是我要找的,但我没有看到设置池中活动线程数 (3-5) 的方法。
所以我的问题是 - 如何查看文件列表,并将文件分配给 open/available 线程?
非常感谢任何帮助,谢谢 -Z
编辑
For Each newfile As String In Directory.GetFiles(fileLoc).AsParallel.WithDegreeOfParallelism(10)
theWorker(newfile)
Next
您不需要自己管理任何池。
Directory.GetFiles(fileLoc)
.AsParallel().WithMaxDOP(3)
.ForEach(path => dowork(path, arg2));
就是这样。通过实验确定最佳并行度。
目前我们有一个服务器,文件以每天大约 10,000 个文件(每小时 500 个)的速度保存。
我的程序已经成功地解析了这些文件并将相关信息输入到数据库中。问题是,我的单线程应用程序几乎跟不上步伐,真的落后了。
我想尝试创建一个包含 3-5 个线程的线程池,看看这是否有助于跟上进度。
应用程序查看文件夹并抓取所有文件名,如下所示:
For Each newfile As String In Directory.GetFiles(fileLoc)
Next
我想做的是根据线程是否处于活动状态将每个文件分配给线程池中的一个线程,如下所示:
For Each newfile As String In Directory.GetFiles(fileLoc)
If Not (Thread1.IsAlive) Then
Thread1 = New Threading.Thread(Sub() dowork(arg1, arg2))
ElseIf Not (Thread2.IsAlive) Then
Thread2 = New Threading.Thread(Sub() dowork(arg1, arg2))
ElseIf Not (Thread3.IsAlive) Then
Thread3 = New Threading.Thread(Sub() dowork(arg1, arg2))
End If
Next
我在浏览论坛时发现了一个使用
的教程 System.Threading.ThreadPool.QueueUserWorkItem(Sub() dowork(arg1, arg2))
不确定这是否是我要找的,但我没有看到设置池中活动线程数 (3-5) 的方法。
所以我的问题是 - 如何查看文件列表,并将文件分配给 open/available 线程?
非常感谢任何帮助,谢谢 -Z
编辑
For Each newfile As String In Directory.GetFiles(fileLoc).AsParallel.WithDegreeOfParallelism(10)
theWorker(newfile)
Next
您不需要自己管理任何池。
Directory.GetFiles(fileLoc)
.AsParallel().WithMaxDOP(3)
.ForEach(path => dowork(path, arg2));
就是这样。通过实验确定最佳并行度。