在指定线程上执行委托(问Control.Invoke的实现机制)

.Net技术 码拜 9年前 (2016-04-30) 1425次浏览
在指定线程上执行委托(问Control.Invoke的实现机制)
假如是多线程,在非UI线程访问控件framework会赐你一个异常。那么通过Control.Invoke(或BeginInvoke)就可以实现让操作回到UI线程操作。看起来的效果就是像图那样,线程A在【调用】两个字那里调用了Control.Invoke(或BeginInvoke,图准确是BeginInvoke),然后线程B就开始执行委托。
问:能不能提供一种方法,对于任何两个线程,能够通过接近普通函数调用的语法,在线程A【调用】委托D,实际执行委托D的是线程B。
有一些人也问过相似的问题:
http://bbs.csdn.net/topics/444818
http://zhidao.baidu.com/link?url=TlgvS4b_pxhJeJac-VhuY0tSW6m2PdWyAs6thZBbhNowdpQtGwZ6U1bp_CdLQc00ivf44K3lK3oplEzIA5G3ha
本人现在是做Socket编程,新开个线程连接服务器,连接上就调用主线程注册的委托,但是委托函数里没办法操作控件,尽管用Control.Invoke可以,假如能实现本人的提问,那就可以省事很多。
之前本人都是在窗口上加个定时器,子线程调用委托之后设置变量,然后等定时器检查变量发现有子线程调用,再调用一个函数这时候就是在主线程运行的。基本代码如下,虽然能实现【在线程A【调用】委托D,实际执行委托D的是线程B】,但是觉得很糟糕。
解决方案

40

引用:

连接上就调用主线程注册的委托,但是委托函数里没办法操作控件,尽管用Control.Invoke可以,

你的这句话明显不合逻辑。
一方面说委托中不能操作控件,同时又说委托中“尽管”用 Invoke 或 BeginInvoke 可以操作控件。你唯一的指责还不合逻辑,本人只能认为你是不理解委托、不喜欢委托语法,没有实质的理由。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在指定线程上执行委托(问Control.Invoke的实现机制)
喜欢 (0)
[1034331897@qq.com]
分享 (0)