代码之家  ›  专栏  ›  技术社区  ›  citizenmatt

有人知道为什么Silverlight不支持Delegate.BeginInvoke吗?

  •  0
  • citizenmatt  · 技术社区  · 14 年前

    MSDN文档说明:

    在Silverlight中,在所有委托类型上自动定义的BeginInvoke方法总是抛出NotSupportedException,因此不能使用它对线程池线程进行异步方法调用。

    但没有说明原因。

    有人知道吗?

    1 回复  |  直到 12 年前
        1
  •  3
  •   Johann Gerell    13 年前

    复杂的问题。
    委托的所有BeginInvoke方法声明看起来像

    [MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]
    public virtual IAsyncResult BeginInvoke(...some params...); 
    

    这里最重要的部分是MethodCodeType.Runtime。它

    指定由运行时提供方法实现。

    有关运行时实现的更多信息,请阅读 this pretty old but still actual article .

    Silverlight是跨平台框架。因此,它应该实现自己的独立于平台(即托管)的异步执行(线程和调度)机制。这就是managed Deployment.Current.Dispatcher类及其BeginInvoke方法的故事,该方法可以从Silverlight调用。

    顺便说一句,Dispatcher和dispatcherooperation类都是符合CLS的,这保证了它们在不同的CLI实现中工作。 所以问题的简短回答

    为什么Delegate.BeginInvoke不是 支持Silverlight?

    因为是时候创建真正的跨平台应用程序了:)