c# - 在共享相同方法的多个线程中使用 Random

标签 c# wpf multithreading dispatcher

我正在使用 xaml 创建一个简单的赛车应用

<StackPanel>
    <Slider x:Name="racerOne" Maximum="1000"/>
    <Slider x:Name="racerTwo" Maximum="1000"/>
    <Button Content="Start Race" Click="myButton_Click"/>
</StackPanel>

我使用下面的代码

    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        Task firstRacer = Task.Run(() => Race(racerOne));
        Task secondRacer = Task.Run(() => Race(racerTwo));
    }

    private void Race(Slider racer)
    { 
        int step = 0;

        while (step < 1000)
        {
            step += new Random().Next(0, 10);
            Dispatcher.BeginInvoke(new ThreadStart(() => racer.Value = step));
            Thread.Sleep(new Random().Next(0, 300));
        }
    }

大多数时候(比如说 90%)两个 slider 似乎一起移动,而在调试中我可以看到每个线程为 step 生成不同的值。怎么会?

最佳答案

Random 由时钟播种;你可能想做这样的事情:

Random rand1 = new Random();
Random rand2 = new Random(rand1.Next());
Task firstRacer = Task.Run(() => Race(racerOne, rand1));
Task secondRacer = Task.Run(() => Race(racerTwo, rand2));

private void Race(Slider racer, Random rand)
{ 
    int step = 0;

    while (step < 1000)
    {
        step += rand.Next(0, 10);
        Dispatcher.BeginInvoke(new ThreadStart(() => racer.Value = step));
        Thread.Sleep(rand.Next(0, 300));
    }
}

这将创建两个单独的 Random 实例具有不同的种子(通过使用第一个来为第二个种子),然后将它们传递到 Race 作为参数。这消除了由于时间安排而导致过度预测行为的任何风险。

关于c# - 在共享相同方法的多个线程中使用 Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974530/

相关文章:

c++ - 如何在新线程中运行静态函数?

c# - Log4net - 不创建日志文件

c# - 动态性能评价

javascript - Razor - 将 Json 结果从 Controller 转换为复杂对象

c - 日志线程的奇怪行为

java - Java 中的 HTTP 帖子和多线程

c# - EntityType '' IdentityUserRole' 没有键定义错误

WPF 可见性属性设计器问题

c# - 在 WPF 中同时验证多个控件

c# - Task.Run 中的全局错误处理