异步循环C#/WPF
我试着在按键下做异步循环,只要按下按钮就可以移动图像异步循环C#/WPF,c#,asynchronous,C#,Asynchronous,我试着在按键下做异步循环,只要按下按钮就可以移动图像 private async void Window_KeyDown(object sender, KeyEventArgs e) { await Task.Run(() => { while (e.IsDown) { if (e.Key.ToString() == "D")
private async void Window_KeyDown(object sender, KeyEventArgs e)
{
await Task.Run(() =>
{
while (e.IsDown)
{
if (e.Key.ToString() == "D")
Width.Text = (int.Parse(Width.Text) - 10).ToString();
}
});
}
但这可能导致一个错误:InvalidOperationException,mscorlib.pdb未加载。在表单中添加布尔值(布尔值IsDown=false)
在keydown事件上,设置IsDown=true;
在keyup事件上设置isDDown=false
在表单中添加一个计时器,并检查您需要的频率,如果为true,则更新
它不会像这个一样连续,但它应该以一种非常简单的方式,也许是过于复杂的方式来消除您的错误。生成一个带有while循环的线程,该循环将持续添加到GUI线程的调度中,以持续执行您想要执行的任务。只要您按住鼠标按钮,它就会执行此操作,当您放开鼠标时,它会停止添加要执行的作业,并且任何排队的作业都会因为实际执行任何工作之前的检查而失败
bool isGoing = false;
private void MouseMouseDown(object sender, MouseButtonEventArgs e)
{
isGoing = true;
new Thread(new ThreadStart(() => { while (isGoing) { Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => { if (isGoing)
{
//Whatever you want to happen continuously ie. move your image
}}));}})).Start();
}
private void MouseUp(object sender, MouseButtonEventArgs e)
{
isGoing = false;
}
这将消除您的错误,并保持连续性
注:
我是用鼠标按的,但用键盘按的效果完全一样
图像移动的速度将取决于计算机的性能,我建议使用定时器,或者更好,在移动图像时使用增量时间计算。这样,您可以每秒移动图像X次,但尽可能随时更新位置,从而获得最平滑、最一致的运动