Nie robię zbyt wiele programowania GUI systemu Windows, więc może to być powszechna wiedza dla osób bardziej zaznajomionych z WinForm niż ja. Niestety nie udało mi się znaleźć żadnych zasobów, aby wyjaśnić problem, napotkany dziś podczas debugowania.Control.EndInvoke resetuje stos wywołań dla wyjątku
Jeśli wywołasz EndInvoke na delegata async. Otrzymamy wyjątek wygenerowany podczas wykonywania metody ponownego wygenerowania. Stos wywołań będzie odzwierciedlał oryginalne źródło wyjątku.
Jeśli jednak zrobimy coś podobnego na Windows.Forms.Control, implementacja Control.EndInvoke resetuje stos wywołań. Można to zaobserwować za pomocą prostego testu lub patrząc na kod w Reflectorze. Odpowiedni fragment kodu z EndInvoke jest tutaj:
if (entry.exception != null)
{
throw entry.exception;
}
Rozumiem, że Begin/EndInvoke Kontroli i asynchronicznych delegatów są różne, ale spodziewałem się podobnego zachowania na Control.EndInvoke.
Czy istnieje jakikolwiek powód, dla którego Control nie robi tego, co jest asynchroniczne, jakie delegaci robią, aby zachować oryginalny stos połączeń?
wiem, ale ponieważ nie jestem jedynym, który realizowany Windows.Forms.Control to z niewielką pomocą. –