C# 文本逐字显示,同时显示while循环
我正在做一个逐字出现的文本 代码如下:C# 文本逐字显示,同时显示while循环,c#,C#,我正在做一个逐字出现的文本 代码如下: public partial class Form1 : Form { public static int index = 0; public int times = 0; public Form1() { times = 1; InitializeComponent(); } public string texto = "Developed by HugoRod";
public partial class Form1 : Form
{
public static int index = 0;
public int times = 0;
public Form1()
{
times = 1;
InitializeComponent();
}
public string texto = "Developed by HugoRod";
private void timer1_Tick(object sender, EventArgs e)
{
if (times==1)
{
label1.Text = texto.Substring(0, index) + "_";
index++;
if (index==texto.Length)
{
index = 0;
times = 2;
}
}
}
}
如果我使用
while (times == 1)
而不是:
if (times == 1)
课文马上就开始了,有人能告诉我为什么吗?
谢谢,只有在输出所有字符后,您才能设置
时间=2
。因此,如果您在循环中运行代码,而循环时,它将继续反复执行循环,直到时间不再为1,这只会在显示所有字符后发生。在当前代码中,您在计时器的每个刻度上添加一个字符
当您更改屏幕上控件的内容时,该控件会使窗口的一部分无效,以表示需要重新绘制该控件,但不会立即重新绘制其屏幕部分。窗口将在运行计时器代码的同一线程中接收一条消息,一旦消息泵收到该消息,将重新绘制标记为无效的部分
重要的是,屏幕更新与计时器代码在同一线程上运行。当计时器代码运行时,屏幕不会更新。这就是为什么当您有一段在UI线程上运行的长时间运行的代码时,UI将停止更新,并且在长时间运行的代码退出并允许消息泵处理排队的消息之前不会对任何事情做出反应。您可以通过插入Thread.Sleep(1000)
在计时器处理程序中获得1秒的延迟,并查看屏幕在这段时间内是否不更新来测试这一点
现在,如果要在单个“长”(相对)过程中将while
循环按顺序将每个字符放入文本框,则通知表单需要重新绘制的消息在添加之间不会被处理。退出代码后,将处理排队的消息,并重新绘制一次屏幕。不要担心其背后的机制,只需接受这样一个事实:您不会从多个更新中获得多个重绘
不仅屏幕不会在添加之间更新,而且整个循环将在难以置信的短时间内完成。忽略~17ms的刷新率—这可能比循环完成所需的时间长得多—您的眼睛无法在毫秒内检测到发生的事情。请学习缩进代码。。while循环为什么会以您描述的方式运行,这会变得有些明显。@HugoRod-查找UI调度-如果方法有效,则方法的原因是每次都会重新调用计时器方法,UI会刷新-如果您在while
循环中进行更新,则在这段时间内不会有任何UI更新,即使您修复此问题,在循环中运行此代码时,
循环仍将显示所有文本Why downvote?答案是正确的,并且回答了所提出的具体问题。仅仅因为代码中有一个额外的bug并不会影响我的答案。我想OP不明白的是,这个while循环也会阻塞ui线程。因此,直到方法完成(并添加整个字符串),文本框才会重新绘制。