Реализация Delegate.BeginInvoke () / EndInvoke () - PullRequest
4 голосов
/ 28 октября 2011

Я хочу знать, как именно BeginInvoke/EndInvoke методы реализованы на делегатах.Я знаю, что они автоматически сгенерированы компилятором и немного особенным, поэтому дизассемблеры не могут их обработать.Но, в конце концов, это исполняемый код, верно?По какой-то причине я не могу найти эквивалент C # в сети.Можете ли вы помочь мне с этим?

Обновление: ОК, я не могу получить это, потому что это неуправляемые вещи (хотя я не понимаю, как это работает с ThreadPool, что абсолютноуправляемый класс).Можете ли вы предложить хорошую статью, которая подробно описывает механику, потому что большинство из них (например, эта ) вообще бесполезны.

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

Эти два метода не генерируются компилятором .NET.Если вы используете .NET Reflector или ILDSAM, вы не найдете код MSIL для этих методов.Они фактически предоставляются самим CLR и поэтому вообще не реализуются с использованием управляемого кода.

На высоком уровне BeginInvoke использует поток из пула потоков для выполнения делегата.Если во время выполнения возникает исключение, оно перехватывается и запоминается.Когда вызывается EndInvoke, он перебрасывает любое запомненное исключение, а если нет, то позволяет получить результат от выполнения делегата.Это все, что он делает, это интересно.

3 голосов
/ 28 октября 2011

Но, в конце концов, выполняется код, верно?

Да, но это неуправляемый код. Они реализованы как extern вызовы в нативных методах в CLR. Вот почему вы не можете найти эквивалент C #.

...