IAsyncResult Implementation Compliant

There is an internal discussion around IAsyncResult implmentation, and the developer responsible for IAsyncResult posted all the invariants that a compliant implementation has to support.

Posted below for your information:

Sent: Monday, March 27, 2006 4:28 PM

Subject: RE: IAsyncResult implementation


A while back we did a project to lay out all the invariants that a compliant implementation has to support.  These are both necessary and sufficient, and are from the point of view of the IAsyncResult consumer.  (That is, as long as the properties behave this way, it doesn’t matter what the implementation is.)


1.    IsCompleted can change from false to true, but never from true to false.

2.    CompletedSynchronously never changes.

3.    If CompletedSynchronously is true, IsCompleted is true.

4.    If AsyncWaitHandle is signaled, IsCompleted is true.

5.    If queried from within the callback, AsyncWaitHandle is signaled.

6.    EndXxx doesn’t block if IsCompleted is true.

7.    The callback is called exactly once, unless BeginXxx throws, in which case it isn’t called.

8.    AsyncWaitHandle is valid (not disposed) until EndXxx is called.

9.    The same instance of IAsyncResult is returned from BeginXxx and passed into the callback.

10. BeginXxx doesn’t block.

11. AsyncState returns the state object passed to BeginXxx.

Comments (5)

  1. Asking... says:

    This is very useful. Can you describe the scenarios under which CompletedSynchronously is true and how this should be handled in a callback? For example, how to deal with posting a new BeginReceive within a callback that was completed synchronously.


  2. mihailik says:

    This place is not clear:

    8. AsyncWaitHandle is valid (not disposed) until EndXxx is called

    Does it mean implementer of BeginXxx/EndXxx and IAsyncResult required to Dispose AsyncWaitHandle?

    Documentation state that disposing AsyncWaitHandle is caller’s responsibility, not IAsyncResult implementer. I never liked this place, because it may IAsyncResult leaky.

    So, with that new guideline any IAsyncResult implementer MUST dispose AsyncWaitHandle on EndXxx if it was allocated. Yes or No?

    Thank you very much.

    Oleg Mihailik, Developer Security MVP

    Kyiv, Ukraine

  3. Sorry folks. Maybe it is not clear but I don’t work in that area and I can’t answer those questions.

    This is restrictly FYI, no question answered.

  4. mihailik says:

    Thank you anyway, Junfeng.

  5. Peter says:

    I think you’re missing at least one rule:

    "There must be at least one circumstance under which ‘IsCompleted’ will return true"

    You can’t make a tighter rule (‘IsCompleted will eventually become true’) becase there are always odd cases where it’s not true.

    Not having the rule means that software can be contractually correct and yet be useless; that’s always a bad thing.