并行使用的管道模式ForEach C#
我在这里唯一的疑问是,我必须添加什么任务才能添加到我的任务列表中,以等待该过程完成。 或者如果你有不同的方法会有所帮助,我基本上想要迭代一个ID集合,在每个ID上有两个过程依赖于另一个结果。 第一项任务是通过本地网络执行的长期任务。 并根据结果,我会添加到“MyCollection”一个新的实例,如果该任务返回true。 立足于管道模式,现在
所以,要控制所有的任务等到他们完成是我的疑问。,请看例子和评论,谢谢。
List<Task> tasks = new List<Task>();
BlockingCollection<MyType> MyCollection = new BlockingCollection<MyType>(IdsCollection.Count);
Parallel.ForEach(IdsCollection,
(Id) =>
{
Task<bool> task1 = Task.Factory.StartNew(() =>
{
//long running task over the network
return DoSmething(Id);
});
Task task1_1 = task1.ContinueWith((isValid) =>
{
if (isValid.Result)
MyCollection.Add(new MyType(Id));
});
// ??? do I need to Add both or the task1 ??
tasks.Add(task1_1);
}
);
Task.WaitAll(tasks.ToArray());
是的,添加task1_1
就足够了,没有理由也明确地等待task1
。
但:
Task
对于两个阶段都会起作用。 List<T>
不是线程安全的,所以你不能像这样从Parallel.ForEach()
内部访问它。 这意味着你的代码可能会抛出,或者更糟的是,会产生不正确的结果。 Parallel.ForEach()
是没有意义的,如果你要做的就是启动一个Task
并设置它的延续。 所有你在这里使用它都会带来一些开销。 await
它,这是更有效的。