2010-09-01 3 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); 

    } 

РЕДАКТИРОВАТЬ

Таким образом, модифицированный код метода (который будет составлять) будет следующее: -

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

EDIT: - Получаю. result.AsyncState возвращает null, потому что я передаю null, когда я вызываю BeginGetResponse(), второй аргумент - AsyncState, и я пропускаю там нуль. Мне нужно передать текущий объект WebRequest, и это будет сделано.

Таким образом, вместо того, чтобы следовать: -

item.BeginGetResponse 
        (
         WriteResponseData, null 
        ); 

Я должен передать предмет: -

item.BeginGetResponse 
         (
          WriteResponseData, item 
         ); 

ответ

1

Как вы уже сказали, этот код would't компилировать просто потому, что метод WriteResponseData не будет ссылка на объект объекта. Вы можете использовать передать свой объект запроса в качестве состояния при вызове begin request. См. this code example из MSDN.

Edit: упрощенный шаблон кода будет

item.BeginGetResponse(WriteResponseData, item); 

И изменить WriteResponseData в

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

Это дает ошибку во время выполнения. Я обновил свой вопрос. –

+0

Я понимаю. result.AsyncState возвращает null, потому что я передаю null, когда я вызываю BeginGetResponse(), второй аргумент - AsyncState, и я пропускаю там нуль. Мне нужно передать текущий объект WebRequest, и это будет сделано. Благодарю. –

Смежные вопросы