2010-09-01 17 views
0

Le code n'est pas complet (il ne se construit pas), car je ne suis pas en mesure d'obtenir le "item" dans la ligne suivante dans le WriteResponseData().WebRequest - Récupération asynchrone des données pour plusieurs requêtes

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

Il me manque quelque chose. S'il vous plaît signaler.

ci-dessous est le code complet: -

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

Ainsi, le code modifié pour la méthode (qui compilerait) serait suit: -

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); 
      } 

Il me donne l'erreur d'exécution suivante: -

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()

EDIT: - Je comprends. result.AsyncState renvoie null parce que je passe null lorsque j'appelle BeginGetResponse(), le second argument est AsyncState et je passe null là. Je devrais passer l'objet WebRequest actuel là et cela ferait l'affaire.

Ainsi, au lieu de ce qui suit: -

item.BeginGetResponse 
        (
         WriteResponseData, null 
        ); 

je passerais l'article: -

item.BeginGetResponse 
         (
          WriteResponseData, item 
         ); 

Répondre

1

Comme vous l'avez dit, ce code would't simplement compiler parce que la méthode WriteResponseData sera pas référence à l'objet objet. Vous pouvez utiliser votre objet de requête comme état lors de l'appel de la demande de début. Voir this code example de MSDN.

Edit: un modèle de code simplifié serait

item.BeginGetResponse(WriteResponseData, item); 

Et modifier WriteResponseData comme

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

Il donne une erreur d'exécution. J'ai mis à jour ma question. –

+0

Je comprends. result.AsyncState renvoie null parce que je passe null lorsque j'appelle BeginGetResponse(), le second argument est AsyncState et je passe null là. Je devrais passer l'objet WebRequest actuel là et cela ferait l'affaire. Merci. –