2015-03-10 2 views
0

Я работаю на загрузку файла в server.I я использую Parallel.ForEach расколоть task.In мой образец SourceParallel.ForEach в динамическом списке

Task.Factory.StartNew (delegate 
{   
    Parallel.ForEach (metaDatas, new ParallelOptions{ MaxDegreeOfParallelism = 3 },   itemModel => 
    { 
     apimanager.ContentConnector.uploadItem (0, itemModel.PhysicalFileName, itemModel.ParentId, itemModel.Size, itemModel.path, fetchDataDelegate, finishedUploadingDataDelegate, failedToUploadDataDelegate);       
    }); 
    Console.WriteLine ("Upload Completed"); 
}); 

в моем списке случае метаданными динамически обновлять. как я могу использовать последний список метаданных в Parallel.ForEach.

+0

Посмотрите на http://stackoverflow.com/questions/11232167/parallel-foreach-on-listobject-thread-safety – FishySwede

+0

Используете ли вы запросы ввода-вывода для загрузки своих данных через запросы 'HTTP' или' FTP'? ? –

+1

metaDas должен быть ConcurrentQueue или BlockingCollection. «Список <>» - неправильный выбор здесь. –

ответ

1

Я встретил ту же проблему.
Я нашел нестандартное решение, которое может помочь.

var buffer = new BlockingCollection<Task>(maxThreads); 

// process while download all threads 
while (!Queue.IsEmpty || buffer.Count > 0) 
{ 
    SomeClass item; 
    while (Queue.TryDequeue(out item)) 
    { 
     var localItem = item; 

     var localTask = new Task(() => 
     { 
      // work with your item 
      // in this place you can append Queue  

      buffer.Take(); // free buffer for adding new threads 
     }); 

     buffer.Add(localTask); 
     localTask.Start(); 
    } 

    // in this point Queue is empty, 
    // but buffer have remaining thread 
    Task.Delay(50).Wait(); 
} 

Итак, Очереди ConcurrentQueue<SomeClass>, ваш dymanic источник

Это не идеальное решение, но это работа.