如何在C#中并行处理任务队列

时间:2015-07-21 10:09:03

标签: c# multithreading parallel-processing

我有需要上传到某处进行处理的文件。文件路径驻留在数据库表中。

在顺序编程中,我获取了20个(可能是n个)文件,然后上传这些文件进行处理并删除这些文件,然后处理20个文件的下一个插槽。

但我需要的是平行上传这些文件,例如与C#中的 TPL(Parallel.For等)并行执行任务。这可以在TPL中轻松实现,但我必须等待所有任务。

例如,在我的任务队列中,我有20个文件,此队列中的19个文件大小为1 MB,但1个文件的大小为500 MB。

因此,当我在此队列上使用 Parallel.For 时,多个线程开始上传这些文件。在这种情况下,较小尺寸的19个文件将被更快地上传,但是1个大尺寸的文件将需要时间。

所以我需要的是在处理更大的文件时,我可以在队列中输入19个其他文件,并开始与该大文件并行处理它们。

1 个答案:

答案 0 :(得分:1)

您可以使用接受Parallel.For类型参数的Parallel.ForEachParallelOptions的重载来执行此操作。

例如(使用ForEach):

ParallelOptions opts = new ParallelOptions {MaxDegreeOfParallelism = 20};
Parallel.ForEach(files, opts, process);

其中files是文件名列表,process声明如下:

private static void process(string file)
{
    ...

这会将ForEach限制为MaxDegreeOfParallelism(在本例中为20)并发线程,并且一旦完成,它将安排一个新线程,直到它用完要安排的项目。