新建线程读取数据后给赋值:报异常了如何处理。
 /////////////////////////////////////////////       
  if (((Control)barButtonItem1).InvokeRequired )) // 问题哦---工具栏上的控件没有InvokeRequired属性;该怎么解决???
 //////////////////////////////////////////////         
  {
                SetTextXml t = new SetTextXml(SetStrXML);   
                this.BeginInvoke(t, new Object[] { per });
            }
            else
            { 
                this.barEditItem2.EditValue = per.T; // 给工具栏上的控件赋值
                this.barEditItem1.EditValue = per.S;
              
         }
  // 问题哦---工具栏(toolbar)上的控件没有InvokeRequired属性;该怎么解决??? 高手进招.。。

解决方案 »

  1.   

    我的做法就是在回调函数里给winform控件赋值,要先设置这个属性 Application.SetCompatibleTextRenderingDefault(false);
    没用过InvokeRquered这种东西
      

  2.   

    InvokeRquered属性在该控件中是没有的Application.SetCompatibleTextRenderingDefault(false); 
    这个好像有不安全因素的似乎不能用的。
      

  3.   

    invoke不需要跑到控件中去,用窗体的invoke就可以了,这个方法只是把操作方式转交给主线程。
      

  4.   

    不要意思贴错代码了应该是 Control.CheckForIllegalCrossThreadCalls = false; 这个属性这是一下就可以在线程回调函函数里访问UI控件了
      

  5.   

    2003 转2005代码的时候都会遇到这样的问题 意思是 在不是创建控件的线程访问修改线程 是非法的  主要2005为了避免死锁
    正确做法有2个 第一个Control.CheckForIllegalCrossThreadCalls = false 暂时关闭安全检测 不推荐
    第2种   先建立一个 委托  public  delegate void DeleEditFrom();
    然后在 你修改界面控件的那个线程 这样写
        调用控件所在界面的 invoke  假如在一个类里面就是 this.invoke(new DeleEditFrom(EidtFrom)); 比如这个方法是
    public void EidtFrom()
    {
       this.text1.text ="修改的值";
    }
      

  6.   

    应该不是用控件的InvokeRequired ,用代理然后用this.InvokeRequired