[英]How do i pause a loop in C# to wait for a user interaction?
在我的程序中有一个循环,只有在用户按下某个按钮时该循环才会停止。 现在,我想给用户一定的时间来按下按钮。 我更改按钮的颜色,以向用户显示停止按钮现在处于活动状态。
this.button.Focus();
this.button.BackColor = Color.Green;
System.Threading.Thread.Sleep(2000);
// now the loop continues and the button changes its color
this.button.BackColor = Color.White;
似乎没有“真正的” 2秒停靠,因为颜色根本不会变绿。
您要进入睡眠状态的线程与负责绘制应用程序的线程相同。 因此,在此处调用Sleep
将仅停止应用程序处理。 这绝对不是您想要执行的操作。
解决此问题的更好方法是使用Timer
对象。 停止处理,更改按钮颜色,并将Timer
设置为在2秒内触发。 如果较早按下按钮,则停止计时器,否则,如果计时器事件触发,则重新开始处理。 此方法将允许应用程序在2秒的窗口内继续运行
您正在阻止UI线程,因此,除非再次释放它,否则无法对用户界面进行其他任何更新。 您需要在此处使用异步; 让UI线程停止执行您的方法并继续处理其他请求。
幸运的是,使用await
关键字使此操作比其他方法容易得多。
首先,我们将只创建一个辅助方法来生成一个任务,该任务将在单击按钮时完成:
public static Task WhenClicked(this Button button)
{
var tcs = new TaskCompletionSource<bool>();
EventHandler handler = null;
handler = (s, e) =>
{
tcs.TrySetResult(true);
button.Click -= handler;
};
button.Click += handler;
return tcs.Task;
}
现在,我们可以轻松地等待,直到经过2秒或单击按钮:
public async void Bar()
{
this.button.Focus();
this.button.BackColor = Color.Green;
await Task.WhenAny(Task.Delay(2000), button.WhenClicked());
// now the loop continues and the button changes its color
this.button.BackColor = Color.White;
}
您的UI
似乎冻结了,您看不到cahgnes。相反,请尝试将此方法设为async
然后使用await
public async void SomeMethod()
{
this.button.BackColor = Color.Green;
await Task.Delay(2000);
this.button.BackColor = Color.White;
}
您不应使用Thread.Sleep()
挂起UI。
尝试这个:
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval=2000;
timer1.Tick += new System.EventHandler(timer1_Tick);
timer1.Start();
private void timer1_Tick(object sender, EventArgs e)
{
//do whatever you want
this.button.BackColor = Color.White;
//Stop Timer
timer1.Stop();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.