异步循环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次,但尽可能随时更新位置,从而获得最平滑、最一致的运动