gpt4 book ai didi

c# - 了解委托(delegate)和任务

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:12 24 4
gpt4 key购买 nike

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;
}
}

我有几个关于这个项目的问题:

  1. main() ,为什么作者没有填充 4 个值(即元素、参数、子结果)?
  2. main() , 什么是元素和参数值?
  3. ForEachParallel()new Tuple<TItem, TParam>(item, param)的作用是什么? ?
  4. ForEachParallel() , var mparam = (Tuple<TItem, TParam>)item2 , item2 是什么?作者是否调用元组功能?

最佳答案

用一个简单的例子来解释这一点是最容易的。

这段代码:

private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}

public static void Main()
{
var result = UppercaseString("hello");
}

完全一样:

private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}

public static void Main()
{
Func<string, string> convert = UppercaseString;
var result = convert("hello");
}

和完全一样:

public static void Main()
{
Func<string, string> convert = inputString => inputString.ToUpper();
var result = convert("hello");
}

第一个例子是传统的做事方式。

第二个示例使用 Func<string, string>创建指向方法的指针(委托(delegate))。

第三个示例使用了 lambda 表达式。

在所有情况下 inputString是方法的参数。 inputString 的值设置为 "hello"调用方法时。

element 也是如此, param , subresultitem2在您的示例代码中。它们都是委托(delegate)的参数。无论调用这些委托(delegate)的是什么,都负责输入参数。

可能使您的代码更难理解的是委托(delegate)在其他方法中用作参数。例如:

private static string Hello(Func<string, string> func)
{
return func("hello");
}

public static void Main()
{
Func<string, string> convert = inputString => inputString.ToUpper();
var result = Hello(convert);
}

另请参阅有关此主题的 MSDN 文档:https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx

关于c# - 了解委托(delegate)和任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com