有人告诉我,Invoke()与普通的方法调用类似...那么为什么人们会选择使用Invoke而不是普通的方法调用?为什么会有人想要使用Invoke()(不是BeginInvoke())?
我试着在网上搜索关于这个问题,我得到的是使用BeginInvoke()的优点,但是使用Invoke()有什么好处?
有人告诉我,Invoke()与普通的方法调用类似...那么为什么人们会选择使用Invoke而不是普通的方法调用?为什么会有人想要使用Invoke()(不是BeginInvoke())?
我试着在网上搜索关于这个问题,我得到的是使用BeginInvoke()的优点,但是使用Invoke()有什么好处?
使用BeginInvoke
当您想要异步调用委托(在线程池中绘制的线程上)和Invoke
(如果要同步调用该委托)。
ThreadPool使用女巫不建议用于长时间运行的过程。 – Peter 2010-10-15 09:22:06
好的回答,好的评论 – 2012-02-01 07:44:27
其中一个原因是,如果您通过反射获得了方法签名,并且您想动态实例化一个函数,那么Invoke()就是这样做的方式。
为了改变,例如,线程执行的东西。
请注意,任何UI控件都应该只能从创建它的线程(实际上是消息泵)操纵。因此,如果另一个线程操纵控件(从其他线程视角同步),那么BeginInvoke会是额外的开销,但Invoke没有问题(特别是因为至少在WPF中有一个快捷方式可以使多个调用序列更快内部执行)。
我想你已经明白代表是什么,代表什么,为什么是有用的。
如果我有一个名为“MyDelegate” deletegate,我能做到“MyDelegate(foo);
”或“MyDelegate.Invoke(foo);
”,但我总是用第二个,所以我可以很容易地看到,当我检查代码,这实际上是一个代表,而不是一个方法。没有内部差异。
首先值得注意的是,我们必须有类似.Invoke()
这样的语言之间的会面点。正如对C#的int
和对VB.NET的Integer
是System.Int32
到它们两者以及任何其他CLR语言一样;我们也有任何CLR语言可以访问的Invoke()
,然后他们可以用适合其语法的方式提供额外的语法糖(大多数会考虑C#中严重的VB风格约定或VB中严重的C#风格约定是句法醋;糖总是必须尽可能匹配其余的语言)。
添加了这种糖,为什么不一直都用它?有些人有时会希望清楚他们正在与代表打交道。有些人不会使用它;我大多没有。像所有语法糖一样,优点和缺点都是清晰而非正确的(事实上,看反射器中的x.Invoke()
的调用,您会发现它是x()
,因为反射器不知道您使用了哪个)。
使用BeginInvoke时,可能会出现http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke – 2010-10-15 09:28:29