快速业务通道

浅谈.NET下的多线程和并行计算(十一).NET异步编程模型基础 下

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
    {

if ((this.ReadStream == null) || (this.ReadStream == Stream.Null))
         {
           WebClient.DownloadBitsReadCallbackState(this, null);
         }

else
         {
           this.ReadStream.BeginRead(this.InnerBuffer, this.Offset, ((int) this.Length) - this.Offset, new AsyncCallback(WebClient.DownloadBitsReadCallback),  this);
         }

         return -1;
       }
       if ((this.ReadStream != null) && (this.ReadStream !=  Stream.Null))
       {
         return this.ReadStream.Read(this.InnerBuffer, this.Offset, ((int) this.Length) - this.Offset);
       }
       return 0;
     }

关注下ReadStream.BeginRead()的回调方法:

private static void DownloadBitsReadCallback(IAsyncResult result)
{
   DownloadBitsState asyncState = (DownloadBitsState)result.AsyncState;
   DownloadBitsReadCallbackState(asyncState, result);
}

继续看看DownloadBitsReadCallbackState:

private static void DownloadBitsReadCallbackState(DownloadBitsState state,  IAsyncResult result)
{
   Stream readStream = state.ReadStream;
   Exception exception = null;
   bool flag = false;
   try
   {
     int bytesRetrieved = 0;
     if ((readStream != null) && (readStream != Stream.Null))
     {

bytesRetrieved = readStream.EndRead(result);

     }
     flag = state.RetrieveBytes(ref bytesRetrieved);
   }
   catch (Exception exception2)
   {
     flag = true;
     if (((exception2 is ThreadAbortException) || (exception2 is  StackOverflowException)) || (exception2 is OutOfMemoryException))
     {
       throw;
     }
     exception = exception2;
     state.InnerBuffer = null;
     if (!(exception2 is WebException) && !(exception2 is  SecurityException))
     {
       exception = new WebException(SR.GetString("net_webclient"),  exception2);
     }
     AbortRequest(state.Request);
     if ((state != null) && (state.WriteStream != null))
     {
       state.WriteStream.Close();
     }
   }
   finally
   {
     if (flag)
     {
       if (exception == null)
       {
         state.Close();
       }
       state.CompletionDelegate(state.InnerBuffer, exception, state.AsyncOp);
     }
   }
}

在这里EndRead(),再来看看再来看看RetrieveBytes()方法:

internal bool RetrieveBytes(ref int bytesRetrieved)
{
   if (bytesRetrieved > 0)
   {
     if (this.WriteStream != null)
     {
       this.WriteStream.Write(this.InnerBuffer, 0, bytesRetrieved);
     }
     else
     {
       this.SgBuffers.Write(this.InnerBuffer, 0, bytesRetrieved);
     }
     if (this.Async)
     {
       this.Progress.BytesReceived += 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号