2012-05-02 5 views
0

Windows Phone 7アプリケーションで非同期ではないサーバーメソッドを使用する方法はありますか? 私はデータのリストを持っています。 foreachループでは、データごとにサーバーに要求を送信しますが、呼び出しの順番で完了しません。どうやってやるの?Windows Phone 7で非同期メソッドを呼び出す

答えて

2

私はデータのリストを持っています。 foreachループでは、データごとにサーバーに要求を送信しますが、呼び出しの順番で完了しません。どうやってやるの?

さてあなたが効果的にそれらを同期することができます - それは実際 foreachループであることを排除し、最初の応答が入って​​くるとき、あなたは2番目のリクエストを送信するように代わりに適切な非同期コールバックを設定します他の要求がなくなるまで(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のの範囲内で捕捉されているので、あなたが正しいアイテムを使用していることを保証します。

関連する問題