看完Futurama第三次或第四次开始结束后,我决定尝试从剧集"两个圣诞老人的故事"中编写随机数倒数发生器。当我第一次开始这个项目时,我一开始只显示一个单一的数字,在这一步骤中程序看起来运行得很好。然后我开始尝试让我的显示器与剧集中的显示器匹配,每个数字之间有第二个延迟。在我添加代码后,我的程序不会显示任何数字,直到它达到零,然后关闭程序。相反,当我第一次点击我的按钮时,它会显示" label"在第一秒然后它切回到实验室"或" la"信的一半直到达到零。我没有关于为什么会发生这种情况的线索,并且会理解为什么会发生这种情况的任何输入。我的代码如下。
namespace FuturomaRandomNumberCountDown
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool keepRunning = true; //used for loop kickout
private void start_Click(object sender, EventArgs e)
{
while (keepRunning == true)
{
Random random = new Random((int)DateTime.Now.Ticks);
int randomNum = random.Next(0, 99);
display.Text = Convert.ToString(randomNum);/display number
Thread.Sleep(1000);//delay
if(randomNum==0)//check for zero
{ keepRunning = false; }//to kick out of the while loop
}
Application.Exit();
}
}
}
答案 0 :(得分:1)
它与线程以及Thread.Sleep
实际执行的操作有关。当您运行程序时,所有与GUI相关的代码都在同一个线程上运行。这是运行所有事件代码的相同线程,因此当您在事件代码中执行某些处理时,GUI将不会更新,直到该代码返回。
在您的情况下,您循环遍历要在同一while循环中显示的每个值。这会占用程序的主线程,并且它不会让GUI有机会在每次更改之间进行更新。另外,当你调用Thread.Sleep
时,会暂停当前线程,在这种情况下是你的主线程。这具有暂停整个程序的效果。
为了做你想做的事,你需要做两件事之一。 use multithreading to put your random number generator on a different thread或use a Timer
object to handle your refreshing。