我被告知Invoke()类似于普通方法调用...那么为什么人们会选择使用Invoke而不是正常的方法调用?
我试图在线搜索这个问题,我得到的是使用BeginInvoke()的优点,但使用Invoke()有什么好处?
答案 0 :(得分:5)
如果要异步调用委托(在从线程池中抽取的线程上),请使用BeginInvoke
,如果要同步调用它,请使用Invoke
。
答案 1 :(得分:3)
一个原因是,如果您通过反射获得了方法签名并且您动态地想要实例化一个函数,那么Invoke()就是您这样做的方式。
答案 2 :(得分:3)
值得注意的是,我们必须使用.Invoke()
之类的东西作为语言之间的会面点。就像{C#的int
和VB.NET的Integer
一样,它们都是System.Int32
,以及任何其他CLR语言;我们也有Invoke()
任何CLR语言都可以提供访问权限,然后他们可以通过适合其语法的方式提供额外的语法糖(大多数人会考虑C#中的VB风格约定或C#中的大量C#约定) VB是语法醋;糖总是必须与其他语言相匹配。
这种糖添加了,为什么不一直使用它?有些人有时希望明确他们正在与代表打交道。有些人不会使用它;我大多不这样做。像所有语法糖一样,优点和缺点是清晰度而不是正确性(事实上,看看反射器中对x.Invoke()
的调用,你会看到它为x()
,因为反射器不知道你用过的。)
答案 3 :(得分:0)
例如,为了改变执行某事的线程。
请注意,任何UI控件都应该可以从创建它的线程(实际上是消息泵)中进行操作。所以,如果另一个线程正在操纵控件(从其他线程的角度来看同步),那么BeginInvoke将是额外的开销,但Invoke很好(特别是因为至少在WPF中有一个快捷方式,因为多个调用序列使得它更快在内部执行。)
答案 4 :(得分:0)
我猜你已经明白代表是什么,代表什么,为什么有用。
如果我有一个名为“MyDelegate”的删除门,我可以执行“MyDelegate(foo);
”或“MyDelegate.Invoke(foo);
”,但我总是使用第二个,所以当我查看代码时,我很容易看到,这实际上是一个委托而不是一个方法。没有内部差异。