Threading.Task.Parallel.For中的C#错误?

| 这是Parallel.For中的错误吗?
   public class DataPoint
        {
            public int Game { get; set; }
            public byte Card { get; set; }
            public byte Location { get; set; }
            public DataPoint(int g,byte c,byte Loc)
            {
                Game = g;
                Card = c;
                Location = Loc;
            }
            public override string ToString()
            {
                return String.Format(\"{0} {1} {2}\",Game,Card,Location);
            }
        }
它一定是Parallel.For中的错误
private static System.Collections.Concurrent.ConcurrentBag<DataPoint> FillData()
    {
        var points = new System.Collections.Concurrent.ConcurrentBag<DataPoint>();
        long c = 32768;
        long z = 0;
        Parallel.For(z, c, (i) =>
        {
            points.Add(new DataPoint( rand.Next(1, 100001),
                                      (byte)rand.Next(1, 144),
                                      (byte)rand.Next(1, 40)));
            });
        return points;
    }
作品
private static System.Collections.Concurrent.ConcurrentBag<DataPoint> FillData()
    {
        var points = new System.Collections.Concurrent.ConcurrentBag<DataPoint>();
        long c = 32769;
        long z = 0;
        Parallel.For(z, c, (i) =>
        {
            points.Add(new DataPoint( rand.Next(1, 100001),
                                      (byte)rand.Next(1, 144),
                                      (byte)rand.Next(1, 40)));
            });
        return points;
    }
并非各自默认为{1,1,1}     
已邀请:
随机类明确记录为不是线程安全的。 您在错误的地点和时间以错误的方式使用了错误的课程。 库中没有错误。 编辑 此处的简短解决方案是
Random()
Parallel.For()
不能很好地结合在一起。只需将Parallel.For替换为普通的
for(;;)
循环即可。对于32k元素,您不会注意到差异。 如果仍然需要并行处理,则必须拆分范围,运行几个Task,然后为每个Task分配自己的Random实例。     
在多线程情况下,随机数永远都不是好事。 阅读:http://msdn.microsoft.com/en-us/library/system.random.aspx     
这是MSFT员工的一篇很棒的博客文章,内容涉及处理并行循环内生成随机数的不同方法及其性能含义: http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx     

要回复问题请先登录注册