在线程中访问主线程创建的控件会出错,
怎么办?最好是帖点源码出来,用CheckForIllegalCrossThreadCalls的就别帖了

解决方案 »

  1.   

    使用System.ComponentModel.BackgroundWorker?
      

  2.   

    这个是跨线程访问参考 // 使用线程安全方法对窗体控件进行操作
             // 首先查询控件的InvokeRequired属性,以此来判断是不是正在从创建这个控件的线程访问该控件
             // 如果不是正在从创建这个控件的线程访问该控件,该方法将创建 SetTextDelegate 的一个实例,
         // 并调用窗体的 Invoke 方法,这使得 SetText 方法被创建 TextBox 控件的线程调用,而且在此线程上下文中将直接设置 Text 属性
             //
             // 如果是从创建该控件的线程访问它,则直接对其进行操作
             private void SetText(string text)
             ...{
                 // InvokeRequired 比较线程ID以及创建控件的线程ID,不同则返回true
                 if (this.textBox1.InvokeRequired)
                 ...{    
                     SetTextCallback d = new SetTextCallback(SetText);
                     this.Invoke(d, new object[] ...{ text });
                 }
                 else
                 ...{
                     this.textBox1.Text = text;
                 }
             }
      

  3.   

    必須通過委託來實現delegate void FormShow();
    FormShow _FormShow;
    _FormShow=new FormShow(ThisShow);
     private void ThisShow()
            {
                this.Show();
                if (_Dat.Save)
                {
                    SaveDat(Application.StartupPath + "\\MyDat.sd");
                }
                f2.Close();
                t.Abort();
            }
    //this.Invoke(_FormShow);線程調用的時候
      

  4.   

    用委托把进度值传回来,然后在主界面掉this.Invoke();
    Invoke里面加上更新进度条的函数