实现没有饥饿的while循环以在wpf中重绘图像
Posted
技术标签:
【中文标题】实现没有饥饿的while循环以在wpf中重绘图像【英文标题】:implement while loop without starvation for redrawing an image in wpf 【发布时间】:2019-10-12 05:48:03 【问题描述】:我有一个 wpf 表单和一个画布,还有一个画布中的图像。我希望这张图片每隔 n 毫秒随机移动一次。我使用了while循环,但它被饿死了。所以我无法通过一个鼠标事件来实现这个动作,看看我对这个动作的想法有多好。这是我下面的代码:
public void movebox()
Random rnd = new Random();
int movex = rnd.Next(0, 2);
int movey = rnd.Next(0, 2);
Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
private void Window_MouseMove(object sender, MouseEventArgs e)
movebox();
我喜欢图像的移动,但现在我有同样的问题。我需要这个对象每隔 n 毫秒自动移动一次而不会饿死。这是我的理想代码:
while(true)
Random rnd = new Random();
int movex = rnd.Next(0, 2);
int movey = rnd.Next(0, 2);
Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
Thread.Sleep(1000);
我现在应该做什么?
【问题讨论】:
我已经根据你的描述发布了答案。然后我想也许你想用这个做动画。这场运动的目的是什么?如果是动画的话,WPF 有相当不错的动画能力。 【参考方案1】:如果你真的想要一个循环,你可以做的一件事是启动另一个线程并使用它。这样,您的 UI 将保持响应。
public void movebox()
Task.Run(() =>
while(true)
Random rnd = new Random();
int movex = rnd.Next(0, 2);
int movey = rnd.Next(0, 2);
Dispatcher.Invoke(() =>
Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
);
Thread.Sleep(1000);
);
然而,更好的方法是像这样使用Timer
:
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
private void dispatcherTimer_Tick(object sender, EventArgs e)
Random rnd = new Random();
int movex = rnd.Next(0, 2);
int movey = rnd.Next(0, 2);
Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
免责声明:我在浏览器中编写了代码。
【讨论】:
以上是关于实现没有饥饿的while循环以在wpf中重绘图像的主要内容,如果未能解决你的问题,请参考以下文章