2012-03-07 10 views
3

BeginXxx/EndXxxパターンを使用してメソッドを非同期に呼び出すと、BeginXxxを呼び出した後にIAsyncResultという結果が得られます。メソッドBeginXxxxまたはEndXxxのいずれも結果変数への参照を持たない場合、どのようにして(戻り値変数の)プロパティ "isCompleted"が更新されますか?IAsyncResultのプロパティisCompletedはどのように更新されていますか?

例:

// 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) { 
    Thread.Sleep(250); 
    Console.Write("."); 
} 

答えて

2

BeginInvokeはあなたにIAsyncResultを返しているので、それはそれへの参照を持つことになります。これは内部で作成され、あなたに送り返されます。例えば

、FileStreamを中BeginReadFileStreamAsyncResultを作成し、それを返します:

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; 
     ar.CallUserCallback(); 
     return ar; 
    } 
+0

OK。それは理にかなっている。したがって、この参照はisCompletedプロパティをfalseに変更するXxxxEndに渡されます。ありがとう... – outlookrperson