111,092
社区成员




private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 100;//设置最大长度值
progressBar1.Minimum = 90;
for (int i = progressBar1.Minimum; i < progressBar1.Maximum ; i++)//循环
{
System.Threading.Thread.Sleep(500);//暂停1秒
textBox1.Text = i.ToString ();
progressBar1.Value = i; //让进度条增加一次
this.Refresh();
}
}
await Task.Delay(....)
这类方式。这显然比声明一个 Timer 来的简单直接。所以我现在推荐这样写代码。这可能就让我们以后再也不用 Timer 了!!!
int i = 0;
private void btnStart_Click(object sender, EventArgs e)
{
i = 0;
progressBar1.Value = 0;
timer1.Interval = 500;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (i < 10)
progressBar1.Value = ++i;
else
timer1.Enabled = false;
}
private void btnStart_Click(object sender, EventArgs e)
{
i = 0;
progressBar1.Value = 0;
timer1.Interval = 1000;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (i < 10)
progressBar1.Value = ++i;
else
timer1.Enabled = false;
}
private async void button1_Click(object sender, EventArgs e)
{
for(var i=0; i<1000; i++)
{
this.label1.Text = i.ToString();
await Task.Delay(1500); //把 1500 改为 500 也不影响这里的说明结论
}
}
那么这里就要理解 async、await 内部机制,否则就容易被自己骗。当执行到 await 语句的时候(这条语句之前),实际上 button1_Click 方法就执行完毕了。例如我们可以用另外一个按钮和文本标签来验证private void button2_Click(object sender, EventArgs e)
{
this.button1_Click(sender, e);
this.label2.Text = "button2_Click执行完毕";
}
这跟你插入 Refresh 是有不同的思路的。做一件事情,然后就把控制权交给进程,然后再让 i 进入下一个循环节点......这是异步编程思路。而你插入的同步顺序的 Refresh 操作,则容易自己把自己绊倒、搅乱、前后颠倒、难以调试。