form1void ShowFrm()
{
  form2 frm=new form2()
  frm.PrgsStart();
try
{
  a();
  frm.SetLabText("a");
  b();
  frm.SetLabText("b");
  c();
  frm.SetLabText("c");
}
finally
{
 frm.PrgsFinish()
}}frm1里的 a(),b() c() 为其他复杂操作form2
{        public void PrgsStart()
        {
            this.Show();
            this.prgsBar.Maximum = 500;
            this.prgsBar.Value = 0;
            this.prgsBar.Step = 5;            IsFinished = false;
            m_StartCount = System.Environment.TickCount;            Thread td = new Thread(new ThreadStart(PrgsStartEvent));
            td.Start();
        }
        private void PrgsStartEvent()
        {
            while (!IsFinished)
            {
                PerformStep();
                Thread.Sleep(200);
            }
        }
        private void PerformStep()
        {
            this.Refresh();
            if (this.prgsBar.Value >= this.prgsBar.Maximum)
                this.prgsBar.Value = 0;
            this.prgsBar.PerformStep();
            int _tick = System.Environment.TickCount - m_StartCount;
            if (_tick > 0)
            {
                SetLabText(this.lblTick, "秒:" + Convert.ToDouble((double)_tick / 1000).ToString("0.00"));
            }
        }        public void PrgsFinish()
        {
            this.Refresh();
            if (this.Created)
            {
                this.Close();
                Dispose();
            }
        }        public void SetLabText(Lable lab, string text)
        {
            this.Refresh();
            if (lab == null || lab.IsDisposed)
                return;
            lab.Text = text;
            lab.Refresh();
            this.Refresh();
        }
}在form1 防治一个按钮 执行方法 ShowFrm() 多次点击后会出现很多错误,例如 对象正在其他地方使用等
不知道有什么好的办法解决?

解决方案 »

  1.   

    判断Control.InvokeRequired 属性
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 
    http://feiyun0112.cnblogs.com/
      

  2.   

    在SetLabText中判断Control.InvokeRequired 属性
      

  3.   

    判断谁的 InvokeRequired ?
    我用了线程 InvokeRequired 是不是始终都为 false ?
      

  4.   

    http://zhidao.baidu.com/question/59300731.html
      

  5.   


    判断InvokeRequired ,如果为true,则通过委托封装到主线程上进行,为false,标识就在主线程上,直接调用,不用委托。
      

  6.   


    现在前面添加代理:public delegate void RefreshDlg(Lable lab, string txt);        public void SetLabText(Lable lab, string text) 
            {
                if(lab.InvokeRequired)
                RefreshDlg refresh = new RefreshDlg(SetLabText);
            }
            else
            {
                this.Refresh(); 
                if (lab == null || lab.IsDisposed) 
                    return;             
                lab.Text = text; 
                lab.Refresh(); 
                this.Refresh(); 
            } 
      

  7.   

    上面写错了
    public void SetLabText(Lable lab, string text) 
    {
        if(lab.InvokeRequired)
        {
            RefreshDlg refresh = new RefreshDlg(SetLabText);
        }
        else
        {
            this.Refresh(); 
            if (lab == null || lab.IsDisposed) 
                return;             
            lab.Text = text; 
            lab.Refresh(); 
            this.Refresh(); 
        } 
    }
      

  8.   


    我发现下午脑子不行了,老错public void SetLabText(Lable lab, string text) 
    {
        if(lab.InvokeRequired)
        {
            RefreshDlg refresh = new RefreshDlg(SetLabText);
            this.Invoke(refresh, new object[] { lab,text });
        }
        else
        {
            this.Refresh(); 
            if (lab == null || lab.IsDisposed) 
                return;             
            lab.Text = text; 
            lab.Refresh(); 
            this.Refresh(); 
        } 
    }
      

  9.   

    RefreshDlg refresh = new RefreshDlg(SetLabText);
    this.Invoke(refresh, new object[] { lab,text });
    这样不行吧?SetLabText 方法带参数的
      

  10.   

    public void SetLabText(Lable lab, string text) 
    {
        if(lab.InvokeRequired)
        {
            RefreshDlg refresh = new RefreshDlg(SetLabText);
            this.Invoke(refresh, new object[] { lab,text });
        }
        else
        {
            this.Refresh(); 
            if (lab == null || lab.IsDisposed) 
                return;             
            lab.Text = text; 
            lab.Refresh(); 
            this.Refresh(); 
        } 
    }这种方法我试过了 不过lab的Text 要等到复杂处理过后才显示变化
      

  11.   

    进度条很label基本处与假死状态 无法更新