所以这个问题是关于 .Net IAsyncResult 设计模式和调用的必要性,EndInvoke
如本问题所述
背景
我有一些代码,我可能会触发对特定函数的许多异步调用,然后等待所有这些调用完成,然后再使用EndInvoke()
来取回所有结果。
问题 1
在我调用之前,我不知道是否有任何调用遇到异常EndInvoke()
,如果其中一个调用发生异常,则整个方法应该失败并且异常被包装到 API 特定异常中并向上抛出。
所以我的第一个问题是确保其余异步调用正确终止的最佳方法是什么?
finally
调用EndInvoke()
其余未终止调用(并忽略任何进一步的异常)的块是最好的方法吗?
问题2
其次,当我第一次启动所有 asyc 调用时,我会调用从我WaitHandle.WaitAll()
的实例中获得的实例数组。触发所有这些异步调用的方法需要遵守超时,因此我将其提供给该方法。然后我测试是否所有调用都已完成,如果没有,则必须达到超时,因此该方法也应该失败并抛出另一个 API 特定异常。WaitHandle
IAsyncResult
WaitAll()
所以我的第二个问题是在这种情况下我应该怎么做?
在抛出错误之前,我需要调用EndInvoke()
以终止所有这些异步调用,但同时我不希望代码因为阻塞而被卡住EndInvoke()
。理论上,至少如果WaitAll()
调用超时,那么所有异步调用本身都应该超时并抛出异常(从而完成调用),因为它们也受超时控制,但这个超时可能与主超时不同