BeginInvoke的问题

PalmerWang 2012-05-04 09:47:41

private void btnGo_Click(object sender, EventArgs e)
{
if (btnGo.Text=="执行")
{
this.Text = "执行中";
btnGo.Text = "停止";
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(EmulateLongProcess));
t.Start();
}
else
{
isCanceled = true;
this.Text = "已经停止";
btnGo.Text = "执行";
}
}
private void EmulateLongProcess()
{
isCanceled = false;
for (int i = 1; i <= 500000;i++ )
{
if (isCanceled==true)
{
break;
}
//System.Threading.Thread.Sleep(10);
int j = System.Threading.Thread.CurrentThread.ManagedThreadId;
double precentDone = (Convert.ToDouble(i) / 500000) * 100;
UpdateProgress(precentDone);
}
}
private delegate void UpdateProgressDelegate(double precentDone);
private void UpdateProgress(double precentDone)
{
if (InvokeRequired==true)
{
BeginInvoke(new UpdateProgressDelegate(UpdateProgress), new object[] { precentDone });
return;
}
if (precentDone==0)
{
isCanceled = true;
}
if (isCanceled)
{
progressBar.Value = 0;
}
else
{
progressBar.Value = Convert.ToInt16(precentDone);
}
statuslable.Text = progressBar.Value.ToString() + "%完成";
if (precentDone==0)
{
statuslable.Text = string.Empty;
}
}

以上代码,直接运行的话,进度条progressBar会慢慢的显示出来,但是状态栏里的statuslable确是等整个进度条走完才显示100%。不会逐步显示从1%---100%。
假如//System.Threading.Thread.Sleep(10);不注释掉的话,状态栏里的statuslable就会逐步显示,请问这是为什么?
求高手指教.
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
PalmerWang 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
这与 progressBar 和 lable 的内部实现机制有关;
[/Quote]
谢谢 (秦梦) 一直就等这样的答案,谢谢你,又长见识了!能交个朋友吗?呵呵
PalmerWang 2012-05-04
  • 打赏
  • 举报
回复
这个我知道,我就想知道为什么:当前线程不停的话,进度条progressBar会慢慢的显示出来,但是状态栏里的statuslable不显示
bdmh 2012-05-04
  • 打赏
  • 举报
回复
System.Threading.Thread.Sleep(10);会让出事件给系统处理其他事情
baiwenyu 2012-05-04
  • 打赏
  • 举报
回复
这与 progressBar 和 lable 的内部实现机制有关;
反编译progressBar .value 的set 方法
public void set_Value(int value)
{
if (this.value != value)
{
if ((value < this.minimum) || (value > this.maximum))
{
throw new ArgumentOutOfRangeException("Value", SR.GetString("InvalidBoundArgument", new object[] { "Value", value.ToString(CultureInfo.CurrentCulture), "'minimum'", "'maximum'" }));
}
this.value = value;
this.UpdatePos();
}
}


而lable.text 没有类似的updatxxx();
---------------
你可以在 statuslable.Text = progressBar.Value.ToString() + "%完成";
之后增加 statuslable.Refresh();


111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧