我正在学习使用并行编程和ForEach方法。是否可以传入一系列操作。
例如,假设我有3种不同的行为:
我想创建一个操作列表(这可能吗?)并添加其中一个操作50次。因此该列表包含50个元素,每个元素都是上述操作之一。
现在,我想将此列表传递给Parallel.Foreach,将MaxDegree设置为x(例如,假设为10)。所以基本上它将会访问10个站点。我有4个核心,所以我无法想象这是一个问题。
对不起,如果这没有任何意义,我没有别的办法来解释我的意思。这是一种合适的方式来做我想要的,还是有更好的(更规范的)方式?
答案 0 :(得分:7)
这可能吗?
是
有更好的(更规范的)方式吗?
没有我能想到的。这正是Parallel框架的设计目标。由于您正在创建Actions列表,因此您可能希望使用Parallel.Invoke:
List<Action> list = GetActions();
Parallel.Invoke(list.ToArray());
除非你想测试各种并发数以找到这个特定目的的最佳数量,否则我只是让框架决定而不是在那里抛出任意数字(如10)。该框架非常聪明。
答案 1 :(得分:4)
是的,您可以使用Action delegates。
Action visitGoogle = () => { /* ... */ };
Action visitYahoo = () => { /* ... */ };
Action visitStackOverflow = () => { /* ... */ };
var actionList = new List<Action> { visitGoogle, visitYahoo, visitStackOverflow };
Parallel.ForEach(actionList,
new ParallelOptions { MaxDegreeOfParallelism = 10 },
x => x());
答案 2 :(得分:2)
那会吗?
List<Action> list;
Parallel.ForEach(list, action => action());
答案 3 :(得分:0)
Action<string> action = p =>
{
VisitSite(p);
};
List<string> sites=new List<string>()
{"www.Google.com", "www.Yahoo.com", "www.StackOverflow.com",...};
Parallel.ForEach(sites,
new ParallelOptions { MaxDegreeOfParallelism = 10 }, action);