gpt4 book ai didi

c# - Parallel.ForEach 循环行为

转载 作者:行者123 更新时间:2023-11-30 22:30:26 24 4
gpt4 key购买 nike

这是我尝试学习 Parallel.Foreach 循环功能的一些示例测试应用

static void Main(string[] args)
{
List<string> Months = new List<string>()
{
"Jan", "Feb", "Mar", "Apr", "May", "June"
};
Parallel.ForEach(Months, (x) => ProcessRandom(x));
Console.ReadLine();
}

public static void ProcessRandom(string s)
{
Random r = new Random();
int i = r.Next(1, 100);
Thread.Sleep(1000);
Console.WriteLine(string.Format("Month Name {0} and Random ID assigned {1}", s, i));
}

我对 foreach 并行的理解是,它将并行运行带有列表中参数的 ProcessRandom 方法。该方法中的所有变量都是独立的,并且它们将彼此独立运行。但是当我运行时,我看到存储在整数“i”中的随机值对于月份列表中的几个条目显示相同,并且一个或可能是 2 个将具有不同的随机值。为什么会这样。并行循环不应该为每次迭代创建新的随机值。如果我使用 parallelOptions 并将 MaxDegree of Parallelism 设置为 1,那么我会在变量“i”中看到不同的值

请指导我理解并行循环。

最佳答案

发生这种情况是因为 Random 不是真正的随机而是伪随机 (http://msdn.microsoft.com/en-us/library/system.random.aspx)。 MSDN 文章的评论中提到了这个确切的问题。当同时创建多个实例并且在两个实例上调用 .Next() 时,它们最终可能会得到相同的结果(由于有限的系统时钟分辨率)。为了解决这个问题,我们应该为每次迭代创建一个唯一的种子。为此你可以做这样的事情(但是有很多方法可以给这只猫剥皮):

static void Main(string[] args)
{
List<string> Months = new List<string>() { "Jan", "Feb", "Mar", "Apr", "May", "June" };
Parallel.ForEach(Months, (x) => ProcessRandom(x));
Console.ReadLine();
}

public static void ProcessRandom(string s)
{
Random r = new Random(s.GetHashCode());
int i = r.Next(1, 100);
Thread.Sleep(1000);
Console.WriteLine(string.Format("Month Name {0} and Random ID assigned {1}", s, i));
}

** 请注意,此示例不保证唯一性,而只是显示为生成种子值的一种方式 **

关于c# - Parallel.ForEach 循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9652047/

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