none
BeginInvoke InvokeRequired 实现是不清楚他的区别 RRS feed

  • 问题

  • 我在多线程调用时,效果是一样的,真不明白, 有无可能bigininvoke可以在主线程和多线程调用, 而invokerequired只能在多线程调用?
    2009年5月14日 14:20

答案

  • Invoke是在UI线程上执行委托(阻塞),BeginInvoke是在UI所在线程上异步执行指定委托(立即返回)。一般对于跨线程调用UI线程上的控件默认是非法的,所以需要调用InvokeBeginInvokeEndInvokeCreateGraphics。

    多线程一般是创建新的Thread,然后执行相应的工作。如果不需要对窗体和控件进行操作则不必使用Invoke

    Invokerequired是确定当前是否需要调用Invoke时需要调用的方法。MSDN上对此的解释是:

    Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。



    ~~~~~ 向着三颗奖牌出发!^o^ ~~~~~
    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    2009年5月14日 15:21

全部回复

  • 还是不太清楚,
    但是试了Invoke后,感觉他是有带锁的,类似多线程变成单线程了。
    而BeginInvoke却没带锁,相当于,多线程而已。。

    2009年5月14日 15:02
  • Invoke是在UI线程上执行委托(阻塞),BeginInvoke是在UI所在线程上异步执行指定委托(立即返回)。一般对于跨线程调用UI线程上的控件默认是非法的,所以需要调用InvokeBeginInvokeEndInvokeCreateGraphics。

    多线程一般是创建新的Thread,然后执行相应的工作。如果不需要对窗体和控件进行操作则不必使用Invoke

    Invokerequired是确定当前是否需要调用Invoke时需要调用的方法。MSDN上对此的解释是:

    Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。



    ~~~~~ 向着三颗奖牌出发!^o^ ~~~~~
    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    2009年5月14日 15:21