110,534
社区成员
发帖
与我相关
我的任务
分享
private void button2_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 3;//设置最大长度值
progressBar1.Minimum = 0;
for (int i = progressBar1.Minimum; i <= progressBar1.Maximum; i++)//循环
{
System.Threading.Thread.Sleep(500);//暂停1秒
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + i.ToString() + "项";
i.ToString();
progressBar1.Value = i; //让进度条增加一次
this.Refresh();
}
}
progressBar1.Maximum = 3;//设置最大长度值
progressBar1.Minimum = 0;
for (int i = progressBar1.Minimum; i <= progressBar1.Maximum; i++)//循环
{
System.Threading.Thread.Sleep(2000);//暂停1秒
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + i.ToString() + "项";
i.ToString();
progressBar1.Value = i; //让进度条增加一次
this.Refresh();
}
如果你实在是只能理解阻塞式编程,可以写 progressBar1.Maximum = 3;//设置最大长度值
progressBar1.Minimum = 0;
System.Threading.ThreadPool.QueueUserWorkItem(h =>
{
for (int i = progressBar1.Minimum; i <= progressBar1.Maximum; i++)//循环
{
var j = i;
System.Threading.Thread.Sleep(2000);//暂停1秒
this.BeginInvoke((Action)delegate
{
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + j.ToString() + "项";
progressBar1.Value = j;
});
}
});
此时你试试看拖动窗口、关闭窗口,能不能看到 UI 操作是干净和灵敏的?
每一个线程都需要占用大量的栈空间,系统中可能有大量的异步、事件操作,可能有至少几百上千个地方需要捕获监听各种事件,所以更好更可取地方式是从一开始就理解什么叫异步编程技术,这样写出来的程序不但能让 UI 线程是干净和灵敏的,而且整个进程内不也根本不会滥用线程、阻塞(Sleep)语句。private async void button2_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 3;//设置最大长度值
progressBar1.Minimum = 0;
for (int i = progressBar1.Minimum; i <= progressBar1.Maximum; i++)//循环
{
await System.Threading.Tasks.Task.Delay(2000);
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + i.ToString() + "项";
progressBar1.Value = i;
}
}
这与上面的使用 QueueUserWorkItem(...) 方法的区别就不仅仅是只看这种小程序的界面了,而是需要看到大的复杂点的系统的背后的知识了。 private void Do()
{
for (int i = progressBar1.Minimum + 1; i <= progressBar1.Maximum; i++)//循环
{
System.Threading.Thread.Sleep(1500);//暂停1.5秒
progressBar1.Value = i; //让进度条增加一次
System.Threading.Thread.Sleep(500);//暂停0.5秒,进度条跳转也要时间,避免产生视觉误差
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + i.ToString() + "项";
i.ToString();
var bm = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); //加了这3句
DrawToBitmap(bm, ClientRectangle);
bm.Save(i + ".png", ImageFormat.Png);
this.Refresh();
}
}
progressBar1.Maximum = 3;//设置最大长度值
progressBar1.Minimum = 0;
for (int i = progressBar1.Minimum; i <= progressBar1.Maximum; i++)//循环
{
textBox1.Text = "共" + progressBar1.Maximum + "项工作 ,已经完成" + i + "项";
progressBar1.Value = i; //让进度条增加一次
Thread.Sleep(1000);
Application.DoEvents();
}