新手在这里。我有这段代码:
while (v < 360)
{
v +=10;
RunIt();
// need to wait half a second here
}
如何等待1/2秒?此外,如果这不是要求太多,我希望重复运行,直到用户点击表单。提前谢谢。
答案 0 :(得分:2)
您可以使用Thread.Sleep
:
while (v < 360)
{
v +=10;
RunIt();
// wait half a second here
Thread.Sleep(500);
}
答案 1 :(得分:2)
如果您只想等半秒钟,可以添加
Thread.Sleep(500);
答案 2 :(得分:1)
在Windows窗体应用程序中,您可以等待一段时间:
System.Threading.Thread.Sleep(500); // Waits for 1/2 second.
答案 3 :(得分:1)
好的,所以我刚尝试使用Thread.Sleep(500)方法,它似乎没有按照jimmy最初的要求做。也许我做错了,但它似乎阻止了线程并导致表单被锁定,因此用户无法单击任何表单按钮或其他任何内容。最后,Windows将表单显示为无响应。
由于目标是在用户单击表单(或表单上的特定控件)之前运行,因此我认为前进的方法是使用计时器对象。下面是我将使用的实现示例。我有一个标准表格,并添加了一个按钮和一个标签。标签显示v的值,每半秒更新一次,直到用户点击按钮。单击该按钮时,该按钮的事件处理程序将停止计时器,从而停止调用RunIt()。
无需“使用System.Threading;”因为我们使用的是System.Windows.Forms.Timer。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
runItTimer.Interval = 500;
runItTimer.Tick += new EventHandler(runItTimer_Tick);
runItTimer.Start();
}
private System.Windows.Forms.Timer runItTimer = new System.Windows.Forms.Timer();
private int v = 0;
void runItTimer_Tick(object sender, EventArgs e)
{
v += 10;
RunIt();
if (v == 360) { v = 0; }
}
private void button1_Click(object sender, EventArgs e)
{
runItTimer.Stop();
}
private void RunIt()
{
label1.Text = v.ToString();
Refresh();
}
}
答案 4 :(得分:0)
你有问题的第一部分,Thread.Sleep。
至于第二部分,你应该熟悉winforms的工作原理。每个UI线程都有自己的消息队列。然后将消息分派到处理它们的适当形式。消息可以指示表单必须自己绘制,按下按键等等。此队列的处理与您的代码在同一个线程上,因此如果您有一个无限循环,那么您将阻止消息队列并且无法处理新消息。这意味着表单不会响应任何事件。要解决这个问题,你必须选择。一种是在后台线程上运行RunIt方法,另一种是强制处理消息队列。前一种方法可能会更好,但一开始你可以试试后者。您可以使用Application.DoEvents方法强制进行消息队列处理。
while (v < 360)
{
v +=10;
RunIt();
Thread.Sleep(500);
// Enable message queue to process events.
Application.DoEvents();
}
以下是阅读的一些内容:
答案 5 :(得分:0)
以下是我的代码的修改版本,它使用了Patko对Application.DoEvents()的建议。请注意,从构造函数启动while循环可以阻止窗体显示在屏幕上。为了解决这个问题,我从Form1_Shown事件开始了while循环。可能还有其他方法来解决这个问题。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//RunMeTillSomeoneClicks(); // !!! Stops the form from being shown.
}
private void Form1_Shown(object sender, EventArgs e)
{
RunMeTillSomeoneClicks();
}
private bool keepOnRunning = true;
private void RunMeTillSomeoneClicks()
{
int v = 0;
while (keepOnRunning && (v < 360))
{
v += 10;
RunIt(v);
System.Threading.Thread.Sleep(500);
if (v == 360) { v = 0; }
Application.DoEvents();
}
}
private void button1_Click(object sender, EventArgs e)
{
keepOnRunning = false;
}
private void RunIt(int v)
{
label1.Text = v.ToString();
Refresh();
}
}