---为什么一个Thread中的方法不能调用另一个Thread中的方法?而Control.BeginInvoke中确能实现这样的调用,原因是什么?能介绍一下吗?

解决方案 »

  1.   

    Control.CheckForIllegalCrossThreadCalls = false;
      

  2.   

    Control为了保证线程安全禁止了这种操作,这种限制是人为的。
    BeginInvoke和Invoke等几个方法属性是Control留出来专门给其它线程调用。
      

  3.   

    MSDN中说:
    获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 
    如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。
    Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。
      

  4.   

    首先,为什么要限制跨线程调用Control的方法和属性呢?这是为了防止“冲突”,因为线程和线程之间是并发进行的。这样就有可能产生两个线程同时操作同一个变量的情况,从而导致发生不可预料的错误。所以Control不允许你这样做。那么Invoke又是用做什么的?
    Invoke()将其它线程要调用的方法以委托的形式“拿”过来,放到Control自己的线程中进行操作,这样便可以防止并发操作
      

  5.   

    有时候看MSDN中文版的时候都怀疑是GOOGLE翻译的
    没办法。。英文挫掩面泪奔~
      

  6.   

    请问,这些都是线程和窗体线程之间的问题。
    我想问问,如果我自己写两个线程Thread1 ,Thread2。 在Thread2这个线程中调用Thread1 中的方法,怎么来实现,不用Framework3.0。
      

  7.   

    第一:
    Control.CheckForIllegalCrossThreadCalls = false;
    线程开始的时候加这么一句,OK,看不到错误了~
    啥都能用了~第二:
    用委托~
      

  8.   


    如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。
      

  9.   


    如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。
      

  10.   

    如果不是control,可以直接调用,多线程就是这样啊.但是最好lock一下.多线程就是要避免线程冲突.