首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

BeginInvoke的有关问题

2012-05-06 
BeginInvoke的问题C# codeprivate void btnGo_Click(object sender, EventArgs e){if (btnGo.Text执行

BeginInvoke的问题

C# code
        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就会逐步显示,请问这是为什么?
求高手指教.

[解决办法]
这与 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();

 

热点排行