我正在使用跟随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%的前提)两个滑块似乎一起移动,而在调试中我可以看到每个线程为步骤生成不同的值.怎么会?
解决方法
随机是由时钟播种的;你可能想做类似的事情:
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实例(通过使用1st来播种第二个),然后将这些实例作为参数传递给Race.这消除了由于时间而导致过度可预测行为的风险.