2010-09-01 24 views
0

代碼不完整(不會生成),因爲我無法在WriteResponseData()的以下行中獲取「項目」。WebRequest - 爲多個請求異步檢索數據

HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result); 

我必須缺少一些東西。請指出。

下面

是完整的代碼: -

static string[] imageUris = 
     { "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/117500/117598.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/106400/106412.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/106400/106411.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/106200/106275.2.jpg", 
     "http://www.cricinfo.com/db/PICTURES/CMS/106300/106362.2.jpg" 
     }; 

     static void Main(string[] args) 
     { 
      SendAsynchronousRequests(); 
      Console.WriteLine("All the files have been requested and retrieved..."); 
      Console.ReadLine(); 
     } 



static void SendAsynchronousRequests() 
     { 
      WebRequest[] requests = InitializeWebRequests(); 
      foreach (var item in requests) 
      { 
       Console.WriteLine("Trying to retrieve :-" + item.RequestUri.OriginalString); 
       item.BeginGetResponse 
       (
        WriteResponseData, 
       ); 
      } 

     } 

    static WebRequest[] InitializeWebRequests() 
    { 
     WebRequest[] requests = new WebRequest[imageUris.Length]; 
     int temp = 0; 
     foreach (var item in imageUris) 
     { 
      requests[temp] = WebRequest.Create(item); 
      //requests[temp].Method = "GET"; 
      temp++; 
     } 
     return requests; 
    } 
    static void WriteResponseData(IAsyncResult result) 
    { 
     HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result); 
     Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode); 
     Console.WriteLine("WebResp.Server :- " + WebResp.Server); 
     Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString()); 
     Console.WriteLine(Environment.NewLine); 

    } 

EDIT

所以,該方法的修改後的代碼(這將編譯)將以下內容: -

WebRequest request = (WebRequest)result.AsyncState; 
      if (result != null && result.IsCompleted) 
      { 
       HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result); 
       Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode); 
       Console.WriteLine("WebResp.Server :- " + WebResp.Server); 
       Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString()); 
       Console.WriteLine(Environment.NewLine); 
      } 

它給我下面的運行時錯誤: -

Object reference not set to an instance of an object. at WebRequestUsingAPM.Program.WriteResponseData(IAsyncResult result) in \WebRequestUsingAPM\Program.cs:line 73 at System.Net.LazyAsyncResult.Complete(IntPtr userToken) at System.Net.ContextAwareResult.CompleteCallback(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Net.ContextAwareResult.Complete(IntPtr userToken) at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken) at System.Net.HttpWebRequest.ProcessResponse()

編輯: - 我明白了。 result.AsyncState返回null,因爲我在調用BeginGetResponse()時傳遞null,第二個參數是AsyncState並且在那裏傳遞null。我應該將當前的WebRequest對象傳遞給那裏,那樣做。

所以,與其以下內容: -

item.BeginGetResponse 
        (
         WriteResponseData, null 
        ); 

我應該通過項目: -

item.BeginGetResponse 
         (
          WriteResponseData, item 
         ); 

回答

1

正如你所說,此代碼我就不會簡單地編譯,因爲WriteResponseData方法不會有參考項目對象。在調用開始請求時,可以使用傳遞請求對象作爲狀態。請參閱MSDN的this code example

編輯:簡化代碼模板將

item.BeginGetResponse(WriteResponseData, item); 

並修改WriteResponseData作爲

static void WriteResponseData(IAsyncResult result) 
{ 
    WebRequest request = (WebRequest)result.AsyncState; 
    WebResponse response = request.EndGetResponse(result); 
    .... 
} 
+0

它提供了運行時錯誤。我更新了我的問題。 – 2010-09-01 08:28:19

+0

我明白了。 result.AsyncState返回null,因爲我在調用BeginGetResponse()時傳遞null,第二個參數是AsyncState並且在那裏傳遞null。我應該將當前的WebRequest對象傳遞給那裏,那樣做。謝謝。 – 2010-09-01 08:40:15