Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Реализация методов делегата


Автор: Idsa 19.7.2008, 21:33
Решил посмотреть в Reflector'е реализацию BeginInvoke для делегата. Был удивлен тем, что, в какой делегат ни глянь, реализация пустая.
Как быть? smile

Автор: mihryak 19.7.2008, 23:29
она, вроде как, не вполне пустая
все эти виртуальные методы помечены атрибутом
Код

[MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]

если я правильно понял скудное описание в http://msdn.microsoft.com/en-us/library/4k10sb5f.aspx'e, реализация зависит от рантайма
сам же механизм работы описан так
Цитата

Asynchronous delegates allow you to call a synchronous method in an asynchronous manner. When you call a delegate synchronously, the Invoke method calls the target method directly on the current thread. If the compiler supports asynchronous delegates, it will generate the Invoke method and the BeginInvoke and EndInvoke methods. If the BeginInvoke method is called, the common language runtime (CLR) will queue the request and return immediately to the caller. The target method will be called on a thread from the thread pool. The original thread, which submitted the request, is free to continue executing in parallel with the target method, which is running on a thread pool thread. If a callback method has been specified in the call to the BeginInvoke method, the callback method is called when the target method returns. In the callback method, the EndInvoke method obtains the return value and any in/out parameters. If no callback method is specified when calling BeginInvoke, EndInvoke can be called from the thread that called BeginInvoke.

т.е. происходит что-то вроде вызова ThreadPool.QueueUserWorkItem

Автор: Idsa 20.7.2008, 01:55
Цитата(mihryak @  20.7.2008,  03:29 Найти цитируемый пост)
т.е. происходит что-то вроде вызова ThreadPool.QueueUserWorkItem 

Примерно это я и ожидал там увидеть, ибо кто-то из классиков ASP.NET (то ли Макдональд, то ли Эспозито) писал, что при реализации асинхронных страниц не стоит использовать метод BeginInvoke делегата, потому что он использует поток из пула.

Цитата(mihryak @  20.7.2008,  03:29 Найти цитируемый пост)
If the compiler supports asynchronous delegates, it will generate the Invoke method and the BeginInvoke and EndInvoke methods.

Судя по этой фразе, требования реализации BeginInvoke и EndInvoke нет в CLS, но есть в CLI. Так?

mihryak, спасибо за конструктивную дискуссию. +1.

Автор: mihryak 20.7.2008, 02:34
Цитата(Idsa @  20.7.2008,  02:55 Найти цитируемый пост)
Судя по этой фразе, требования реализации BeginInvoke и EndInvoke нет в CLS, но есть в CLI. Так?

хм.. я это понял иначе: делегат - это вполне себе CTS-тип, и BeginInvoke тоже стандартен, но их конкретное поведение определяется рантаймом
вот ещё нашёл http://msdn.microsoft.com/en-us/library/96b1ayy4.aspx, где о делегатах говорится как о CTS-типе

а штука-то и правда загадочная smile

Автор: Idsa 21.7.2008, 13:29
Цитата(mihryak @  20.7.2008,  06:34 Найти цитируемый пост)
хм.. я это понял иначе: делегат - это вполне себе CTS-тип, и BeginInvoke тоже стандартен, но их конкретное поведение определяется рантаймом

Да-да, с недоCTS я погорячился.

Вообще интересно было бы поглядеть, как там внтури организовывается работа со ThreadPool, ведь ThreadPool.QueueUserWorkItem работает с фиксированным делегатом (т. е. с методами с фиксированной сигнатурой)...

Автор: Idsa 23.7.2008, 11:14
Схожу-ка я с этим вопросом на RSDN...

Автор: mihryak 2.8.2008, 12:10
Цитата(Idsa @  23.7.2008,  12:14 Найти цитируемый пост)
Схожу-ка я с этим вопросом на RSDN... 

прояснилось что-нибудь? smile 

Автор: Idsa 3.8.2008, 09:12
Цитата(mihryak @  2.8.2008,  16:10 Найти цитируемый пост)
прояснилось что-нибудь? 

Вот эта тема: http://rsdn.ru/Forum/message/3032669.flat.aspx#3032669
На RSDN, как и всегда, люди не очень общительные и многословные smile
И так и не понял, как можно написать необходимый wrapper.

Автор: Skynin 8.8.2008, 13:30
может так: http://vingrad.ru/blogs/skynin/2008/08/06/sozdanie-potoka-v-net-cf/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)