有人告诉我 Invoke() 类似于普通的方法调用......那么为什么人们会选择使用 Invoke 而不是普通的方法调用呢?
我试图在网上搜索这个问题,我得到的是使用 BeginInvoke() 的优点,但是使用 Invoke() 的优点是什么?
有人告诉我 Invoke() 类似于普通的方法调用......那么为什么人们会选择使用 Invoke 而不是普通的方法调用呢?
我试图在网上搜索这个问题,我得到的是使用 BeginInvoke() 的优点,但是使用 Invoke() 的优点是什么?
BeginInvoke
当您想要异步调用委托(在从线程池中提取的线程上)并且Invoke
想要同步调用它时使用。
首先值得注意的是,我们必须有类似.Invoke()
语言之间的交汇点之类的东西。正如int
C# 和Integer
VB.NETSystem.Int32
之于它们两者以及任何其他 CLR 语言一样;所以我们也有Invoke()
任何 CLR 语言可以提供访问,然后他们可以以适合其语法的方式提供额外的语法糖(大多数人会认为 C# 中的大量 VB 样式约定或 VB 中的大量 C# 样式约定是语法醋; 糖总是必须尽可能地匹配语言的其余部分)。
这个糖加了,为什么不一直用呢?有些人有时会想清楚他们正在与代表打交道。有些人只是不会使用它;我大多不会。像所有语法糖一样,优点和缺点是清晰而不是正确性的问题(实际上,查看对x.Invoke()
in reflector 的调用,您会发现它是x()
因为反射器不知道您使用了哪个)。
一个原因是,如果您已经通过反射获得了方法签名并且您想要动态地实例化一个函数,那么 Invoke() 就是您这样做的方式。
为了改变,例如,执行某事的线程。
请注意,任何 UI 控件都应该并且始终只能从创建它的线程(实际上是消息泵)中进行操作。因此,如果另一个线程正在操作控件(从其他线程的角度同步),那么 BeginInvoke 将是额外的开销,但 Invoke 很好(特别是因为至少在 WPF 中,这里有一个用于多个调用序列的快捷方式,可以使其更快内部执行)。
我想您已经了解了委托是什么、有什么用以及为什么有用。
如果我有一个名为“MyDelegate”的删除门,我可以使用 " MyDelegate(foo);
" 或 " MyDelegate.Invoke(foo);
" ,但我总是使用第二个,这样我在查看代码时就可以很容易地看到,它实际上是一个委托而不是一个方法。没有内部差异。