永发信息网

Invoke和BeginInvoke的区别

答案:2  悬赏:50  手机版
解决时间 2021-02-08 16:52
  • 提问者网友:感性作祟
  • 2021-02-08 12:45
Invoke和BeginInvoke的区别
最佳答案
  • 五星知识达人网友:思契十里
  • 2021-02-08 13:14
查看MSDN如下:
Control..::.Invoke ---> 在拥有此控件的基础窗口句柄的线程上执行委托。
Control..::.BeginInvoke ---> 在创建控件的基础句柄所在线程上异步执行委托。
显然,Invoke() 与 BeginInvoke() 方法间的主要区别在于“异步”关键字眼。
也就是说,
Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。
控件为何会需要Invoke()或BeginInvoke()方法呢?
因为控件的这样一个特点:控件的数据(或状态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的,则其它任何线程B都不允许修改控件的值,只可以访问(读取)。控件的值只能在线程A上进行更改。
基于以上原因,而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。所以,Invoke()/BeginInvoke() 就出现了。使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行。
全部回答
  • 1楼网友:思契十里
  • 2021-02-08 13:59
class program { delegate void test(); static void main(string[] args) { test ts = new test(testdelegate); ts.begininvoke(null,null); //使用到委托的begininvoke方法 console.writeline("hello"); } internal static void testdelegate() { thread.sleep(5000); } } 上面程序代码中使用到begininvoke方法,此时控制台会立刻输出hello字符,然后结束主程序运行。由此可知begininvoke是在主线程之外,另起了一个线程来运行其所需的代码。 再看下面这点程序 class program { delegate void test(); static void main(string[] args) { test ts = new test(testdelegate); ts.invoke(); //使用到委托的invoke方法 console.writeline("hello"); } internal static void testdelegate() { thread.sleep(5000); } } 唯一区别就是使用到了 invoke方法,此时控制台会等待5秒,然后才输出hello字符。由此可知invoke是使用主线程运行其代码的,并没有另起线程。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯