不能让foreach同时运行

时间:2016-03-28 22:27:23

标签: c# visual-studio c#-4.0 foreach

我一直在尝试运行一个循环,它同时为每个变量执行相同的逻辑。 我一直在尝试使用foreach循环,但不是同时执行它,它一次需要一个值并为它执行逻辑然后传递给下一个,而不是同时为所有这些执行。 我们以此为例:

public static ArrayList MyFamily = new ArrayList() { "Me", "Mom", "Dad", "Brother" }
public static bool SayPrayer = false;
public static bool PickUpTheFork = false;
public static bool StartEating = false;

现在让我们说我希望让我的家人在同一时间以同样的方式在晚餐时表现:

public static void Dinner ()
{
    foreach (string Person in MyFamily)
    {
        SayPrayer = true;
        Thread.Sleep(30000);
        SayPrayer = false;
        PickUpTheFork = true;
        Thread.Sleep(3000)
        PickUpTheFork = false;
        StartEating = true;
    }
}

我认为如果我为每个动作制作不同的foreach循环并将thread.sleep放在它们之间(在循环之外),它会以某种方式工作。但是,有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您有权访问task parallel library,则Parallel.ForEach方法会完全符合您的要求。

Parallel.ForEach(MyFamily, (person) => {
    // perform operations
});

修改:由于评论中提到了这一点,我在此处提及:您的操作将同时运行 ,但这可能不需要每项任务它自己的线程。 TPL 尝试尽可能同时在MyFamily集合的每个成员上运行这些操作。

答案 1 :(得分:0)

在这种情况下,我将为Person类中的每个布尔值定义一个静态变量。

public class Person{
    public static bool SayPrayer = false;
    public static bool PickUpFork = false;
    public static bool StartEating = false;
    //...
}

然后你可以简单地设置这些静态变量,这些变量将适用于MyFamily集合的每个成员......

    Person.SayPrayer = true;
    Thread.Sleep(30000);
    Person.SayPrayer = false;
    Person.PickUpTheFork = true;
    Thread.Sleep(3000)
    Person.PickUpTheFork = false;
    Person.StartEating = true;

这是一种干净(并且内存有效)的方式来执行您描述的操作,无需迭代或第三方库。