【发布时间】:2015-07-30 09:34:48
【问题描述】:
public static Task<TResult> ForEachParallel<TItem, TSubResult, TResult, TParam>(this IEnumerable items, Func<TItem, TParam, TSubResult> map, Func<TSubResult[], TResult> reduce, TParam param)
{
if (items == null) { throw new ArgumentNullException("items"); }
if (map == null) { throw new ArgumentNullException("map"); }
if (reduce == null) { throw new ArgumentNullException("reduce"); }
return Task<TResult>.Factory.StartNew(() =>
{
List<Task<TSubResult>> tasks = new List<Task<TSubResult>>();
foreach (TItem item in items)
{
Task<TSubResult> t = Task<TSubResult>.Factory.StartNew(item2 =>
{
var mparam = (Tuple<TItem, TParam>)item2;
return map(mparam.Item1, mparam.Item2);
},
new Tuple<TItem, TParam>(item, param),
TaskCreationOptions.None | TaskCreationOptions.AttachedToParent);
tasks.Add(t);
}
List<TSubResult> results = new List<TSubResult>();
foreach (Task<TSubResult> task in tasks)
{
results.Add(task.Result);
}
return reduce(results.ToArray());
});
}
static void Main(string[] args)
{
var a = Generate().ForEachParallel<int, int, int, int>(
(element, param) =>
{
var result = element * param;
Console.WriteLine("Map: {0}, {1}", result, Task.CurrentId);
Thread.Sleep(new Random(DateTime.Now.Millisecond).Next(500));
return result;
},
(subresult) =>
{
var sum = 0;
foreach (var item in subresult)
{
sum += item;
}
Console.WriteLine("Reduce: {0}", sum);
return sum;
},
5);
Console.WriteLine(a.Result);
}
}
static IEnumerable Generate()
{
for (int i = 0; i < 100; i++)
{
yield return i;
}
}
我有几个关于该计划的问题:
-
main()中,为什么作者没有填充4个值 (即,元素,参数,子结果)? -
main()中的元素和参数值是什么? - 在
ForEachParallel()中,new Tuple<TItem, TParam>(item, param)的作用是什么? - 在
ForEachParallel()、var mparam = (Tuple<TItem, TParam>)item2中,item2是什么?作者是在调用元组吗 功能?
【问题讨论】:
-
“作者”是什么意思?什么是“即”?
-
它是来自博客的示例应用程序,即“它们如下”,为什么作者没有传递第四个参数