Решил посмотреть в Reflector'е реализацию BeginInvoke для делегата. Был удивлен тем, что, в какой делегат ни глянь, реализация пустая.
Правда, методы помечены атрибутом MethodImpl c параметром MethodCode=MethodCodeType.Runtime.
Насколько я понимаю, это значит, что код в BeginInvoke подставляется в Runtime. Зачем такие сложности?
Зачем мне нужен этот исодный код? Дело в том, что во всех описаниях асинхронных методов делегатов говорится, что методы вызываются при помощи ThreadPool. Но при этом ThreadPool.QueueUserWorkItem принимает делегат с фиксированной сигнатурой... Поэтому меня и заинтересовала реализация работы со ThreadPool в делегатах.
Здравствуйте, Idsa, Вы писали:
I>Насколько я понимаю, это значит, что код в BeginInvoke подставляется в Runtime.
Это означает, что реализация находится в виртуальной машине.
I>Зачем такие сложности?
А как иначе?
I>Зачем мне нужен этот исодный код? Дело в том, что во всех описаниях асинхронных методов делегатов говорится, что методы вызываются при помощи ThreadPool. Но при этом ThreadPool.QueueUserWorkItem принимает делегат с фиксированной сигнатурой... Поэтому меня и заинтересовала реализация работы со ThreadPool в делегатах.
Если сигнатура неизвестна, то можно использовать базовый тип Delegate.
Здравствуйте, Mab, Вы писали:
Mab>А как иначе?
Так же, как и тысячи другие методов в классах.
Что повлияло на то, чтобы реализация этого метода находилась в виртуальной машине?
Mab>Если сигнатура неизвестна, то можно использовать базовый тип Delegate.
Можно. Но в ThreadPool я не вижу методов, которые принимали бы Delegate.
Здравствуйте, Idsa, Вы писали:
I>Так же, как и тысячи другие методов в классах. I>Что повлияло на то, чтобы реализация этого метода находилась в виртуальной машине?
То, что делегат -- это встроенное в VM понятие, не выражающееся в более простых терминах.
Mab>>Если сигнатура неизвестна, то можно использовать базовый тип Delegate. I>Можно. Но в ThreadPool я не вижу методов, которые принимали бы Delegate.
Напишите нужный wrapper.
Здравствуйте, Mab, Вы писали:
I>>Зачем такие сложности? Mab>А как иначе?
Как в F# и Nemerle — генерировать классы. Получается куда эффективнее.
Вообще, делегаты какая-то ошибка природы. В начале, когдя я изучал дотнет казалось, что это очень красивое решение. А чем дальше в лес, тем больше понимаю, что кривое это решение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.