C# 暂停循环,等待按钮点击后继续

3
我有一个在组件初始化后被调用的方法,方法签名如下:
public async void method_name ()
{
    // code ...
}

在这个方法中,我有一个循环,其中包含4个不同的if语句。我需要循环在每个if语句处暂停并等待用户按下按钮,因为按下该按钮将添加信息和其他内容。一旦按下按钮,我希望循环继续并当然在下一个if语句处暂停。
我考虑使用await Task.Delay(30000);,但是如果用户在计时器结束之前完成输入信息,他/她将只是在等待,这是不高效的。

3
这听起来像是一个 XY 问题,是否有可能先获得用户输入? - Sayse
你能解释一下你想要进行的计算类型吗? - Enigmativity
1
"async void" 是为事件处理程序而设计的。你可能不应该在其他地方使用它。 - i3arnon
这是一个游戏,所以你需要选择你的移动,然后当你点击一个按钮时,它会输入移动,这时循环应该获取值,执行它应该执行的操作,然后继续进行。我希望这样能够澄清问题。 - GK28
这是什么样的项目?大多数游戏引擎都使用自己的游戏循环,这种情况下,您只需要捕获用户输入即可。如果它是类似于winforms的东西,那么您可能只想发明自己的游戏循环(在按钮点击时增加一个变量,例如动量,以便在下一帧更新),或者以回合制的方式在按钮点击时更新游戏。注意:后者不适合游戏开发,我强烈建议使用类似于mono/xna/unity/udk的东西。 - Sayse
1个回答

8
你可以使用 TaskCompletionSource 来实现这个功能。创建它并等待其 Task 属性,当按钮被点击时,使用它来完成该任务。这允许异步等待用户的输入,而无需阻塞线程或使用 Task.Delay
TaskCompletionSource<bool> _tcs;

async Task Foo()
{
    // stuff
    _tcs = new TaskCompletionSource<bool>();
    await _tcs.Task
    // other stuff
}

void ButtonClicked(object sender, EventArgs e)
{
    _tcs.SetResult(false);
}

1
好答案 - 希望我能+2 - Tom Wright
嗯,由于我对UI编码和C#都很陌生,我是否只需要在then循环内的嵌套if语句中调用foo方法,这样会暂停循环直到我点击按钮? - GK28
@GK28 Foo是你的方法,它的method_name是什么。你的“暂停”在await _tcs.Task处,你可以将其放在if之前(或之后,取决于你的逻辑)。如果你需要这个方法用于4个不同的按钮,请使用4个不同的TCSs。 - i3arnon
哦,我明白你的意思了,等一下,我要试一下。 - GK28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接