How is the IsCompleted property of the IAsyncResult updated?

When I call the method asynchronously (using the BeginXxx / EndXxx template), I get the result IAsyncResult

after calling BeginXxx. How is the "isCompleted" property (in the returned result variable) updated if neither the BeginXxxx method nor EndXxx has a reference to the result variable?


// Create the delegate.
AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);

// Initiate the asychronous call.
IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);

// Poll while simulating work.
while(result.IsCompleted == false) {



source to share

1 answer


returns to you IAsyncResult

, so it will refer to it. This will be internally generated and sent back to you.

For example, BeginRead

in FileStream creates FileStreamAsyncResult

and then returns it:

private unsafe FileStreamAsyncResult BeginReadCore(byte[] bytes, int offset, int numBytes, AsyncCallback userCallback, object stateObject, int numBufferedBytesRead)
    NativeOverlapped* overlappedPtr;
    FileStreamAsyncResult ar = new FileStreamAsyncResult {
        _handle = this._handle,
        _userCallback = userCallback,
        _userStateObject = stateObject,
        _isWrite = false,
        _numBufferedBytes = numBufferedBytesRead
    ManualResetEvent event2 = new ManualResetEvent(false);
    ar._waitHandle = event2;


    if (hr == 0x6d)
        overlappedPtr->InternalLow = IntPtr.Zero;
        return ar;




All Articles