我正在处理上传到服务器的文件。我使用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。
答案 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>
,你的动态源
这不是完美的解决方案,但它是有效的。