Реализация методов делегата
От: Idsa Россия  
Дата: 23.07.08 08:20
Оценка:
Решил посмотреть в Reflector'е реализацию BeginInvoke для делегата. Был удивлен тем, что, в какой делегат ни глянь, реализация пустая.
Правда, методы помечены атрибутом MethodImpl c параметром MethodCode=MethodCodeType.Runtime.
Насколько я понимаю, это значит, что код в BeginInvoke подставляется в Runtime. Зачем такие сложности?

Зачем мне нужен этот исодный код? Дело в том, что во всех описаниях асинхронных методов делегатов говорится, что методы вызываются при помощи ThreadPool. Но при этом ThreadPool.QueueUserWorkItem принимает делегат с фиксированной сигнатурой... Поэтому меня и заинтересовала реализация работы со ThreadPool в делегатах.
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re: Реализация методов делегата
От: Mab Россия http://shade.msu.ru/~mab
Дата: 23.07.08 08:26
Оценка:
Здравствуйте, Idsa, Вы писали:

I>Насколько я понимаю, это значит, что код в BeginInvoke подставляется в Runtime.

Это означает, что реализация находится в виртуальной машине.

I>Зачем такие сложности?

А как иначе?

I>Зачем мне нужен этот исодный код? Дело в том, что во всех описаниях асинхронных методов делегатов говорится, что методы вызываются при помощи ThreadPool. Но при этом ThreadPool.QueueUserWorkItem принимает делегат с фиксированной сигнатурой... Поэтому меня и заинтересовала реализация работы со ThreadPool в делегатах.

Если сигнатура неизвестна, то можно использовать базовый тип Delegate.
Re[2]: Реализация методов делегата
От: Idsa Россия  
Дата: 25.07.08 07:06
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>А как иначе?

Так же, как и тысячи другие методов в классах.
Что повлияло на то, чтобы реализация этого метода находилась в виртуальной машине?

Mab>Если сигнатура неизвестна, то можно использовать базовый тип Delegate.

Можно. Но в ThreadPool я не вижу методов, которые принимали бы Delegate.
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[3]: Реализация методов делегата
От: Mab Россия http://shade.msu.ru/~mab
Дата: 25.07.08 07:15
Оценка:
Здравствуйте, Idsa, Вы писали:

I>Так же, как и тысячи другие методов в классах.

I>Что повлияло на то, чтобы реализация этого метода находилась в виртуальной машине?
То, что делегат -- это встроенное в VM понятие, не выражающееся в более простых терминах.

Mab>>Если сигнатура неизвестна, то можно использовать базовый тип Delegate.

I>Можно. Но в ThreadPool я не вижу методов, которые принимали бы Delegate.
Напишите нужный wrapper.
Re[2]: Реализация методов делегата
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.08 03:23
Оценка: +2
Здравствуйте, Mab, Вы писали:

I>>Зачем такие сложности?

Mab>А как иначе?

Как в F# и Nemerle — генерировать классы. Получается куда эффективнее.
Вообще, делегаты какая-то ошибка природы. В начале, когдя я изучал дотнет казалось, что это очень красивое решение. А чем дальше в лес, тем больше понимаю, что кривое это решение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.