2010-10-15 62 views
1

有人告诉我,Invoke()与普通的方法调用类似...那么为什么人们会选择使用Invoke而不是普通的方法调用?为什么会有人想要使用Invoke()(不是BeginInvoke())?

我试着在网上搜索关于这个问题,我得到的是使用BeginInvoke()的优点,但是使用Invoke()有什么好处?

+0

使用BeginInvoke时,可能会出现http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke – 2010-10-15 09:28:29

回答

5

使用BeginInvoke当您想要异步调用委托(在线程池中绘制的线程上)和Invoke(如果要同步调用该委托)。

+3

ThreadPool使用女巫不建议用于长时间运行的过程。 – Peter 2010-10-15 09:22:06

+0

好的回答,好的评论 – 2012-02-01 07:44:27

3

其中一个原因是,如果您通过反射获得了方法签名,并且您想动态实例化一个函数,那么Invoke()就是这样做的方式。

0

为了改变,例如,线程执行的东西。

请注意,任何UI控件都应该只能从创建它的线程(实际上是消息泵)操纵。因此,如果另一个线程操纵控件(从其他线程视角同步),那么BeginInvoke会是额外的开销,但Invoke没有问题(特别是因为至少在WPF中有一个快捷方式可以使多个调用序列更快内部执行)。

0

我想你已经明白代表是什么,代表什么,为什么是有用的。

如果我有一个名为“MyDelegate” deletegate,我能做到“MyDelegate(foo);”或“MyDelegate.Invoke(foo);”,但我总是用第二个,所以我可以很容易地看到,当我检查代码,这实际上是一个代表,而不是一个方法。没有内部差异。

+0

你知道吗,你不需要额外的“Invoke”来知道它是一个委托而不是一个方法?您可以将鼠标悬停在上面,或按F12键。 – Timwi 2010-10-15 10:49:26

+0

我知道:D但我想要认识到,只是阅读quicly的代码:) – vtortola 2010-10-18 15:32:43

3

首先值得注意的是,我们必须有类似.Invoke()这样的语言之间的会面点。正如对C#的int和对VB.NET的IntegerSystem.Int32到它们两者以及任何其他CLR语言一样;我们也有任何CLR语言可以访问的Invoke(),然后他们可以用适合其语法的方式提供额外的语法糖(大多数会考虑C#中严重的VB风格约定或VB中严重的C#风格约定是句法醋;糖总是必须尽可能匹配其余的语言)。

添加了这种糖,为什么不一直都用它?有些人有时会希望清楚他们正在与代表打交道。有些人不会使用它;我大多没有。像所有语法糖一样,优点和缺点都是清晰而非正确的(事实上,看反射器中的x.Invoke()的调用,您会发现它是x(),因为反射器不知道您使用了哪个)。

相关问题