Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#暂停循环并在单击按钮后继续_C#_.net_Loops_Async Await - Fatal编程技术网

C#暂停循环并在单击按钮后继续

C#暂停循环并在单击按钮后继续,c#,.net,loops,async-await,C#,.net,Loops,Async Await,我有一个在初始化组件之后调用的方法,方法签名如下: public async void method_name () { // code ... } 在该方法中,我有一个循环运行4个不同的if语句。我需要循环在每个if语句处暂停,并等待用户按下按钮。因为按下那个按钮会添加信息和东西。按下按钮后,我希望循环继续,当然在下一个if语句时暂停 我想这样做就像等待任务。延迟(30000)但如果用户在计时器结束前输入完信息,他/她将只是等待。这是没有效率的。您可以使用TaskCompletion

我有一个在初始化组件之后调用的方法,方法签名如下:

public async void method_name ()
{
    // code ...
}
在该方法中,我有一个循环运行4个不同的
if
语句。我需要循环在每个if语句处暂停,并等待用户按下按钮。因为按下那个按钮会添加信息和东西。按下按钮后,我希望循环继续,当然在下一个if语句时暂停


我想这样做就像等待任务。延迟(30000)但如果用户在计时器结束前输入完信息,他/她将只是等待。这是没有效率的。

您可以使用
TaskCompletionSource
实现这一点。创建它并等待它的
任务
属性,然后在单击按钮时使用它来完成该任务。允许异步等待用户输入,而无需阻塞线程或使用
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);
}
TaskCompletionSource\u tcs;
异步任务Foo()
{
//东西
_tcs=新任务完成源();
等待任务
//其他东西
}
已单击void按钮(对象发送者,事件参数e)
{
_tcs.SetResult(假);
}

这听起来像是一个XY问题,是否不可能预先获取用户输入?您能否解释您尝试执行的计算类型?
async void
用于事件处理程序。你可能不应该在其他任何地方使用它。这是一个游戏,所以你有选择你的移动,然后当你点击一个按钮时,它进入移动,这时循环应该得到值,做它应该做的,然后继续。我希望这能澄清这是一个什么样的项目?大多数游戏引擎使用自己的游戏循环,在这种情况下,您只需要捕获用户的输入。如果是winforms之类的东西,那么您可能只想发明自己的游戏循环(增加一个变量,例如按钮点击上的动量,以便在下一帧更新),或者以基于回合的方式在按钮点击上更新游戏。注意:后者不适合游戏开发,我强烈建议使用mono/xna/unity/udkGreat-answer-但愿我能+2hmm。。由于我对他的整个UI编码和C#都不熟悉,我是否只需在then循环中的嵌套if语句中调用方法foo,这将暂停循环直到我单击按钮?@GK28
foo
是您的方法,它是
method\u name
。您的“暂停”位于
wait_tcs.Task
,如果
,您可以将其置于
之前(或之后,取决于您的逻辑)。如果你在4个不同的按钮上需要这个,请使用4个不同的TCS。哦,我明白你的意思,1秒钟,去试试看