解决方案 »

  1.   

    delegate是委托,本身不能解决跨线程访问控件的问题,直接调用委托还是会报错
    Invoke指定用主线程中的控件去调用这个委托,相当于主线程来执行这个函数
      

  2.   

    目测你在主窗体有个控件调用了23行run方法,那么  
    dispFrameView(pframe);               直接使用delegate
    m_Form.Invoke(dispFrameView, pframe);  使用窗体的invoke
    没区别的都是主线程调用
    如果你不在主线程调用run那么就会有跨线程问题,这时候要用invoke了,直接调用委托会报跨线程access exception
      

  3.   

    1楼和2楼都把话说完了...
    只有委托是不能解决跨线程访问控件错误的....只能用invoke..
      

  4.   

    http://www.cnblogs.com/hyddd/archive/2009/07/26/1531538.html
    http://blog.sina.com.cn/s/blog_9ffc639301011bil.html
      

  5.   

    delegate是委托,invoke是控件的唤醒函数
      

  6.   

    没想到发帖才过了几分钟就有回帖了,非常感谢各位大神,看了各位的答案,还有一个疑问:
    我在主线程开了一个子线程调用run()这个方法,那么用dispFrameView(pframe)和m_Form.Invoke(dispFrameView, pframe)都没问题,如果我在另一个线程调用这个方法,是否只能使用invoke?
      

  7.   

    这不是方法的问题...用invoke是因为你的控件是ui线程创建的.而你改变值却是在ui线程以外...这时候如果使用普通的方式就会引发跨线程访问控件的异常...调用invoke则是让ui线程自己去根据参数修改控件...这是合法的..
    而你说的..既然你都开了子线程调用run()了..那么另外一个线程对主线程来说一样是子线程..只要不跨域,都能直接调用..