Parallel.Foreach在动态列表中

时间:2015-03-10 07:57:23

标签: c# parallel-processing scheduled-tasks

我正在处理上传到服务器的文件。我使用Parallel.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");
});

在我的情况下,metaDatas列表是动态更新的。我可以在Parallel.ForEach中使用最新的metaDatas List。

1 个答案:

答案 0 :(得分: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>,你的动态源

这不是完美的解决方案,但它是有效的。