Кто-нибудь знает, почему Delegate.BeginInvoke не поддерживается в Silverlight? - PullRequest
0 голосов
/ 16 ноября 2010

Состояние документов MSDN:

В Silverlight метод BeginInvoke, который автоматически определяется для всех типов делегатов, всегда вызывает исключение NotSupportedException, поэтому его нельзя использовать для выполнения асинхронных вызовов методов для потоков пула потоков.

Но не говорится, почему.

У кого-нибудь есть идея?

1 Ответ

3 голосов
/ 17 ноября 2010

Сложный вопрос.
Все объявления методов BeginInvoke для делегатов выглядят как

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

Наиболее важной частью здесь является MethodCodeType.Runtime. Это

Указывает, что реализация метода обеспечивается средой выполнения.

Подробнее о реализации во время выполнения вы можете прочитать в этой довольно старой, но все еще актуальной статье .

Silverlight - это кроссплатформенная платформа. Поэтому он должен реализовать свой собственный независимый от платформы (то есть управляемый) механизм асинхронного выполнения (многопоточность и диспетчеризация). Это история управляемого класса Deployment.Current.Dispatcher и его метода BeginInvoke, который может вызываться из Silverlight.

Кстати, классы Dispatcher и DispatcherOperation совместимы с CLS, что гарантирует их работу в различных реализациях CLI. Итак, краткий ответ на вопрос

почему Delegate.BeginInvoke не является поддерживается на Silverlight?

потому что пришло время создавать ДЕЙСТВИТЕЛЬНО кроссплатформенные приложения:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...