2011-07-15 39 views
2

我有一個我想使用httpWebRequest訪問的地址列表。 我需要的是服務器返回的狀態碼。在WP7中執行多個webrequests?

我試圖通過他們進行foreach,並開始一個httpWebRequest對他們每個人,但後來我只收到最後一個回調。 似乎一次只允許一個webrequest。

我很難理解如何在沒有GetResponse的情況下做到這一點,這在Silverlight中是不允許的。

代碼在後臺工作中運行。 我正在使用芒果 - WP7.1

我該如何解決?

foreach (var current in Addresses) 
     { 
      var request = HttpWebRequest.Create(current); 
      request.BeginGetResponse(r => 
      { 
       try 
       { 
        var response = (HttpWebResponse)request.EndGetResponse(r); 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
        { 
         //BOOM RECEIVED 
        }); 
       } 
       catch (Exception) 
       { 
        Debug.WriteLine("Error in EndGetResponse"); 
       } 
      }, null); 
     } 

在此先感謝=)

+0

你在用芒果嗎? –

+0

是的,我使用芒果=) – Moulde

+0

你收到什麼樣的「BOOM」? – CodeZombie

回答

1

你一個響應的問題是最有可能被你使用匿名方法產生的,當你把這些循環中的範圍界定工作的方式。您在循環中的每個步驟上扔掉早先的請求引用。

參見這裏http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html

的話題我的博客帖子來說明這是一個擁有全部的方法來重寫你的代碼最簡單的方法,這迫使你要考慮的範圍,而不是在您的代表只是一味referening外部變量。

foreach (var current in Addresses) 
{ 
    var request = HttpWebRequest.Create(current); 
    request.BeginGetResponse(EndGetResponse, new RequestState { Request = request, Address = current }); 
} 


private void EndGetResponse(IAsyncResult result) { 
    try { 
    var state = (RequestState)result.AsyncState; 
    var response = (HttpWebResponse)state.Request.EndGetResponse(result); 
    Deployment.Current.Dispatcher.BeginInvoke(GotResponse, state.Address, response.StatusCode); 
    } catch (Exception) { 
    Debug.WriteLine("Error in EndGetResponse"); 
    } 
} 

private void GotResponse(Address address, HttpStatusCode code) { 
    //BOOM RECEIVED 
} 

public class RequestState { 
    HttpWebRequest Request { get; set; } 
    Address Address { get; set; } 
} 

一旦你解決範圍的問題,如果你喜歡,你可以重寫回文體上anonymos方法。

這隻會解決您的第一個獲取所有響應的問題,但是,我認爲您還需要在完成所有請求以檢查整個批次的狀態時運行一些代碼?
這是完全不同的問題。

你不能使用WaitOne()或類似的東西,它會鎖定你的線程並停止實際運行的請求。您可能想要在BOOM代碼中調用其他方法來存儲結果,並檢查是否所有結果都尚未結束。

+0

我看到如何使用完整的方法而不是匿名將解決問題。但是,如果問題本身就是匿名方法的使用,我將如何能夠將其重寫爲匿名方法?我很好奇,因爲使用匿名方式可以更輕鬆地引用循環中的對象。在我的項目中,地址位於一個對象上,而我正在迭代的集合實際上是這些對象的列表。當收到請求響應時,我需要啓動請求的對象來保存一些返回的值。 – Moulde

+1

@Moulde就是這個問題,你不能僅僅引用匿名方法以外的對象,我的博客文章解釋了當你做什麼時會發生什麼。我已經更新了答案,以顯示如何將更多的狀態傳遞給響應。 –