Я не много занимаюсь программированием Windows GUI, так что все это может быть общеизвестно для людей, более знакомых с WinForms, чем я. К сожалению, я не смог найти никаких ресурсов, чтобы объяснить проблему, с которой я столкнулся сегодня во время отладки.
Если мы вызываем EndInvoke для асинхронного делегата. Мы получим любое исключение во время выполнения метода повторно. Стек вызовов будет отражать исходный источник исключения.
Однако, если мы делаем нечто подобное в Windows.Forms.Control, реализация Control.EndInvoke сбрасывает стек вызовов. Это можно наблюдать с помощью простого теста или путем просмотра кода в Reflector. Соответствующая выдержка из кода EndInvoke находится здесь:
if (entry.exception != null)
{
throw entry.exception;
}
Я понимаю, что Begin / EndInvoke на Control и асинхронные делегаты различаются, но я ожидал бы похожее поведение на Control.EndInvoke.
Есть ли какая-либо причина, по которой Control не делает то, что делают асинхронные делегаты, чтобы сохранить исходный стек вызовов?