Я нашел достойный пример того, как асинхронно вызывать делегат с таймаутом... http://www.eggheadcafe.com/tutorials/aspnet/847c94bf-4b8d-4a66-9ae5-5b61f049019f/basics-make-any-method-c.aspx. В итоге он использует WaitOne с таймаутом, чтобы определить, не вызывается ли вызов до истечения таймаута.
Я также знаю, что вы должны иметь EndInvoke для соответствия каждому BeginInvoke.
Итак, что произойдет, если истечет время ожидания ожидания? Мы (предположительно) НЕ хотим вызывать EndInvoke, поскольку это блокирует. Код может продолжать делать "другие вещи", но мы что-то пропустили? Есть ли какая-то бедная нить где-то заблокированная, ожидающая возвращения, которая никогда не произойдет? Пропустили ли мы какую-то память, где будет размещен результат-то-будет-никогда-возврат?