2015-07-21 5 views
1

У меня есть файлы, которые нужно загрузить где-то для обработки. Пути файлов находятся в таблице базы данных.Как обрабатывать очередь задач параллельно в C#

В последовательном программировании я получаю связку из 20 (может быть n) файлов и загружаю эти файлы для обработки и удаления этих файлов, а затем обрабатывает следующий слот из 20 файлов.

Но мне нужно загрузить эти файлы параллельно, как выполнение задачи параллельно с TPL в C# (Parallel.For и т. Д.). Это легко можно сделать в TPL, но я должен ждать всех задач.

Например, в моей очереди задач у меня есть 20 файлов и 19 файлов в этой очереди имеют размер 1 МБ, но 1 файл имеет размер 500 МБ.

Так что, когда я использую Parallel.For В этой очереди несколько потоков начинают загружать эти файлы. В этом случае 19 файлов с меньшим размером будут загружаться быстрее, но 1 файл с большим размером займет время.

Так что мне нужно при обработке большего файла, я могу ввести 19 других файлов в очередь и начать их обработку параллельно с этим большим файлом.

+0

Вы действительно должны проверить [TPL DataFlow] (https://msdn.microsoft.com/en-us/library/hh228603%28v=vs.110%29.aspx), так как он соответствует вашим требованиям очень хорошо. – spender

+0

Вы уверены, что вам нужно загрузить их в ** parallel **, а не ** async **? –

ответ

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) одновременные потоки, и как только один заканчивается, он будет планировать новый, пока не закончится расписание.

Смежные вопросы