---为什么一个Thread中的方法不能调用另一个Thread中的方法?而Control.BeginInvoke中确能实现这样的调用,原因是什么?能介绍一下吗? ---为什么一个Thread中的方法不能调用另一个Thread中的方法?而Control.BeginInvoke中确能实现这样的调用,原因是什么?能介绍一下吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Control.CheckForIllegalCrossThreadCalls = false; Control为了保证线程安全禁止了这种操作,这种限制是人为的。BeginInvoke和Invoke等几个方法属性是Control留出来专门给其它线程调用。 MSDN中说:获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。 首先,为什么要限制跨线程调用Control的方法和属性呢?这是为了防止“冲突”,因为线程和线程之间是并发进行的。这样就有可能产生两个线程同时操作同一个变量的情况,从而导致发生不可预料的错误。所以Control不允许你这样做。那么Invoke又是用做什么的?Invoke()将其它线程要调用的方法以委托的形式“拿”过来,放到Control自己的线程中进行操作,这样便可以防止并发操作 有时候看MSDN中文版的时候都怀疑是GOOGLE翻译的没办法。。英文挫掩面泪奔~ 请问,这些都是线程和窗体线程之间的问题。我想问问,如果我自己写两个线程Thread1 ,Thread2。 在Thread2这个线程中调用Thread1 中的方法,怎么来实现,不用Framework3.0。 第一:Control.CheckForIllegalCrossThreadCalls = false;线程开始的时候加这么一句,OK,看不到错误了~啥都能用了~第二:用委托~ 如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。 如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。 如果不是control,可以直接调用,多线程就是这样啊.但是最好lock一下.多线程就是要避免线程冲突. C#中何时使用static? 如何从dll文件(含有 好几个xml)读取xml文件中特定的节点值,属性值,然后读取到数据库中。 使用C#关闭当前窗体怎么写?? 关于如何显示类库中方法的注释的问题 请问我将图片旋转30度,写的代码,只显示了图片,但没有旋转 打开某个文件,然后对里面的部分内容进行替换?怎样操作 picturebox的内存为什么不断增加? 关于DataGrid列标题显示的问题!急急急... ... {求助}C# sqlserver2005 网络连接 问题!非局域网 如何读取txt可看,担不是一般的字体的txt文件 应用程序跑着跑着就没了 错误日志如下 请大家说说反射的好处
BeginInvoke和Invoke等几个方法属性是Control留出来专门给其它线程调用。
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。
Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。
Invoke()将其它线程要调用的方法以委托的形式“拿”过来,放到Control自己的线程中进行操作,这样便可以防止并发操作
没办法。。英文挫掩面泪奔~
我想问问,如果我自己写两个线程Thread1 ,Thread2。 在Thread2这个线程中调用Thread1 中的方法,怎么来实现,不用Framework3.0。
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~第二:
用委托~
如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。
如果不是Control,可以直接调用,我的第一个回帖已经说明,Control中不允许跨线程调用是人为的限制。但是还是建议使用lock进行操作,防止并发。