楼主肯定是用了Tcp,或者UDp的阻塞式监视,得到消息后再调用刷新Ui控件的方式
定义一个委托private delegate void RefreshOneKeyHander(string[] str);你在得到消息之后
RefreshOneKeyHander handler=new RefreshOneKeyHander(this.RefreshKeys);
object[] array=new object[1];
string ddd=temp[3]+":"+temp[4]+":New";
array[0]=ddd.Split(':');
this.BeginInvoke(handler,array);
continue;RefreshKeys 这个就是你刷新Ui控件里的方法了

解决方案 »

  1.   

    1.1的话不调试不会出现这个错误,如果要调试,需要使用delegate来更新不是该线程创建的控件的内容,要不就出现上面的错误记得有本书说过这样是为了线程安全什么的
      

  2.   

    用delegate来做,否则会出现意想不到的错误,在2.0中,有个窗体属性就是设置是否可以进行跨线程操作,选是就可以了。
      

  3.   

    建议使用界面的SynchronizationContext对象同步一下,也不是很麻烦的
      

  4.   

    一.  多线程访问winform控件出现异常的解决方法1.  问题描述
    <1> 如果创建某控件的线程之外的其他线程试图调用该控件,则会引发一个 InvalidOperationException异常。
    (1) 并提示消息:“从不是创建控件 control name 的线程访问它。” <2> 默认情况下,winform控件只能由创建该控件的线程调用 。
    (1) 如果要在新的线程中调用该控件,则需要使用控件的invoke方法来进行。************************************************************************************************2. 解决方法1:
    <1> 说明:非线程安全方式。
    (1) 代码放在构造函数中。<2> 设置Control类的静态属性CheckForIllegalCrossThreadCalls为false。
    (1) 形式:Control.CheckForIllegalCrossThreadCalls = false;************************************************************************************************3. 解决方法2:
    <1> 说明:线程安全方式。<2> 定义委托:delegate void CrossThreadCallHandler( object[] datas );<3> 定义访问winform控件的方法:
    void SetControlValue( object[] datas )
    {
    //访问控件的代码
    }<4> 在新线程中调用winform控件
    if ( 控件ID.InvokeRequired )
    {
    控件ID.Invoke( new CrossThreadCallHandler( SetControlValue ) , new object[] { 值1,值2 } );
                    
    }
    else
    {
    //访问控件的代码
    }
      

  5.   

    我的的确是UDp 通讯
    我知道要用委托
    奇怪的就是 其中在服务端 居然没有用道委托 也能跨线程给UI 付值.....
    比较两格程序 没有什么异议..
    想不明白...
      

  6.   

    不是不可以访问UI,就是很容易出问题。另外只有Debugger里面抛出异常,而直接运行没有异常。我原来一直以为每异常就不管了,后来出了莫名其妙的问题才想起来是线程访问冲突了。只好改成同步的。后来学会了用BackgroundWorker之后就连Thread也不自己写了,就用MSFT封装好的来做了。使用BW同步就很容易了。
      

  7.   

    在Form1_Load这个事件里加上这句话试试
    Control.CheckForIllegalCrossThreadCalls = false;
      

  8.   

    顶上去,我的程序也遇到了这个问题,居然没有报错,里面也没有 Control.CheckForIllegalCrossThreadCalls = false;这样的设置。。 奇怪.
      

  9.   


    两种方法 
    1.可以在主线程中添加一个语句CheckForillegalCrossThreadCalls = false; 
    2.用委托,如下在主线程中调用test()方法就行了。 private delegate void SetTextCallbakc(); 
    //主线程中调用方法 
    public void test() 
            { 
                SetTextCallbakc stcb = new SetTextCallbakc(callbakc); 
                Invoke(stcb);  
            } //具体要调用的方面 
    public void callbakc() 
    {}本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yunhaiC/archive/2011/05/12/6415032.aspx
      

  10.   

    楼主没报错的是windows xp系统的吧,xp的确不会报这个错。
    不过服务器上server系统(比如windows server 2003)的就会出这个错了,出错形式多种多样。。比如控件一个大红叉,或者就像楼主这样的直接报文字异常