Non eseguo molta programmazione della GUI di Windows, quindi potrebbe essere una conoscenza comune a chi ha più familiarità con WinForm di quanto lo sia io. Purtroppo non sono stato in grado di trovare risorse per spiegare il problema, che ho incontrato oggi durante il debug.Control.EndInvoke reimposta lo stack di chiamate per l'eccezione
Se chiamiamo EndInvoke su un delegato asincrono. Otterremo qualsiasi eccezione generata durante l'esecuzione del metodo re-generato. Lo stack di chiamate rifletterà la fonte originale dell'eccezione.
Tuttavia, se facciamo qualcosa di simile su un Windows.Forms.Control, l'implementazione di Control.EndInvoke reimposta lo stack di chiamate. Questo può essere osservato con un semplice test o guardando il codice in Reflector. Il brano relativo codice da EndInvoke è qui:
if (entry.exception != null)
{
throw entry.exception;
}
Capisco che Begin/EndInvoke per il controllo e delegati asincroni sono diversi, ma mi sarei aspettato un comportamento simile su Control.EndInvoke.
C'è qualche ragione per cui Control non fa ciò che i delegati asincroni fanno per preservare lo stack di chiamate originale?
lo so, ma dal momento che non sono colui che ha implementato Windows.Forms.Control è di scarso aiuto. –