我有需要上传到某处进行处理的文件。文件路径驻留在数据库表中。
在顺序编程中,我获取了20个(可能是n个)文件,然后上传这些文件进行处理并删除这些文件,然后处理20个文件的下一个插槽。
但我需要的是平行上传这些文件,例如与C#中的 TPL(Parallel.For等)并行执行任务。这可以在TPL中轻松实现,但我必须等待所有任务。
例如,在我的任务队列中,我有20个文件,此队列中的19个文件大小为1 MB,但1个文件的大小为500 MB。
因此,当我在此队列上使用 Parallel.For 时,多个线程开始上传这些文件。在这种情况下,较小尺寸的19个文件将被更快地上传,但是1个大尺寸的文件将需要时间。
所以我需要的是在处理更大的文件时,我可以在队列中输入19个其他文件,并开始与该大文件并行处理它们。
答案 0 :(得分:1)
您可以使用接受Parallel.For
类型参数的Parallel.ForEach
或ParallelOptions
的重载来执行此操作。
例如(使用ForEach
):
ParallelOptions opts = new ParallelOptions {MaxDegreeOfParallelism = 20};
Parallel.ForEach(files, opts, process);
其中files
是文件名列表,process
声明如下:
private static void process(string file)
{
...
这会将ForEach
限制为MaxDegreeOfParallelism
(在本例中为20)并发线程,并且一旦完成,它将安排一个新线程,直到它用完要安排的项目。