2012-05-02 32 views
0

有什麼辦法在windows phone 7應用程序中使用不異步的服務器方法? 我有一個數據列表。在foreach循環中,爲每個數據發送一個請求給服務器,但是它們沒有按照我的調用順序完成。我怎樣才能做到這一點?在Windows Phone 7中調用異步方法

回答

2

我有一個數據列表。在foreach循環中,爲每個數據發送一個請求到服務器,但是它們沒有按照我的調用順序完成。我怎樣才能做到這一點?

那麼你可以有效地使他們同步 - 擺脫它作爲一個實際 foreach循環的,而是建立適當的異步回調,這樣當第一反應進來,你發送的第二個請求等等,直到沒有更多的請求。 (您可能希望使用Queue<T>來排隊發送請求。)

0

不要因爲某些東西似乎不起作用而返回同步方式。在異步世界中工作有很多好處。還有一些危險。關鍵是知道如何避免這些危險。 這是一個使用WebClient的例子,它會產生有害的影響。

foreach (var item in items) 
{ 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (sender, args) => 
     { 
      item.Stuff = args.Result; 
     }; 
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff")); 
} 

當返回客戶端,也不能保證item是「創造」的客戶端請求相同的項目。這被稱爲「訪問修改更近」。這僅僅意味着你可能試圖修改不存在的東西,或者不一樣。 這個正確的方法是捕捉到的foreach內您的項目像這樣:

foreach (var item in items) 
{ 
    var internalItem = item; 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (sender, args) => 
     { 
      internalItem.Stuff = args.Result; 
     }; 
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff")); 
} 

這可確保您使用的是正確的項目,因爲它已經在foreach的範圍內拍攝。