并行Foreach和行动

时间:2012-03-01 20:27:39

标签: c# task-parallel-library

我正在学习使用并行编程和ForEach方法。是否可以传入一系列操作。

例如,假设我有3种不同的行为:

  • visitGoogle
  • VisitYahoo
  • VisitStackOverflow

我想创建一个操作列表(这可能吗?)并添加其中一个操作50次。因此该列表包含50个元素,每个元素都是上述操作之一。

现在,我想将此列表传递给Parallel.Foreach,将MaxDegree设置为x(例如,假设为10)。所以基本上它将会访问10个站点。我有4个核心,所以我无法想象这是一个问题。

对不起,如果这没有任何意义,我没有别的办法来解释我的意思。这是一种合适的方式来做我想要的,还是有更好的(更规范的)方式?

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