C#中的任务-使用Random不清楚结果

巴托斯

我正在学习C#中的异步编程,并编写了以下代码来测试Task Parallel Library(控制台应用程序):

static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();

    var opr1 = new SlowOperation();
    var opr2 = new SlowOperation();

    //TASK
    Console.WriteLine("Started processing using TASK. Start: {0}", sw.Elapsed);
    sw.Start();

    Task.Factory.StartNew(() => opr1.PerformSlowOperation(1));
    Task.Factory.StartNew(() => opr2.PerformSlowOperation(2));

    Console.WriteLine("Stopped processing using TASK. Stop: {0}", sw.Elapsed);
    sw.Stop();

}

运行缓慢的地方:

public class SlowOperation
{
    public void PerformSlowOperation(int id)
    {
        var rand = new Random();
        double sum = 0;

        for (int i = 0; i < 100000000; i++)
        {
            var number = Convert.ToDouble(rand.Next(100)) / 100;
            sum += number;
        }
        Console.WriteLine("Finished processing operation no. {0}. Final sum calculated is: {1}", id, sum.ToString("0.##"));
    }
}

谁能帮助我了解为什么SlowOperation类的每个实例产生的总和完全相同?

usr

Random根据时间以低分辨率播种。这是一个经典问题,在我看来是API设计错误。我认为CoreCLR存储库中已对此进行了更改。

new Random().Next() == new Random().Next() 几乎总是如此。

还要注意,问题中的95%的代码与该问题无关。将来,您可以自己简化代码,直到只剩下随机调用为止。这样您就可以自己发现此类问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章