2015-07-21 56 views
1

我有文件需要上傳到某處進行處理。文件路徑駐留在數據庫表中。如何在C#中並行處理任務隊列#

在順序編程中,我獲取一堆20個(可能是n個)文件並上傳這些文件進行處理並刪除這些文件,然後處理20個文件的下一個插槽。

但我需要的是平行上傳這些文件,就像在012#C##(Parallel.For等)中的TPL並行執行任務。這在TPL中可以輕鬆實現,但我必須等待所有任務。

例如在我的任務隊列中,我有20個文件,此隊列中的19個文件的大小爲1 MB,但是一個文件的大小爲500 MB。

所以當我在這個隊列上使用並行。對於,多線程開始上傳這些文件。在這種情況下,19個較小尺寸的文件將會更快上傳,但是1個較大尺寸的文件需要花費時間。

所以我需要的是在處理較大的文件時,我可以在隊列中輸入19個其他文件並開始處理它們,並行處理大文件。

+0

你真的應該檢查出[TPL DataFlow](https://msdn.microsoft.com/en-us/library/hh228603%28v=vs.110%29.aspx),因爲它非常適合你的要求。 – spender

+0

您確定需要將它們上傳到**並行**而不是**異步**嗎? –

回答

1

您可以通過使用Parallel.ForParallel.ForEach的過載來實現,該過載接受ParallelOptions類型的參數。

例如(使用ForEach):

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

哪裏files是列表中的文件和process聲明如下:

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

這將限制ForEachMaxDegreeOfParallelism(在這種情況下, ,20)同步線程,並且一旦完成,它將安排一個新線程,直到其用完爲止。