2011-02-04 8 views
3

Silverlight 4でWebClientまたはHttpWebRequestを使用してHTTPアクセスを非同期にするため、複数のhttp取得/投稿を連続して実行する場合は、次のようなコードを記述します。Silverlightで複数の非同期HTTPリクエストを連続して処理する

doFirstGet(someParams,() => 
    { 
    doSecondGet(someParams,() => 
     { 
     doThirdGet(... 
     } 
    }); 

または類似のもの。私はコールバック内で後続の呼び出しをネストすることになります。通常は、ある種のlambdaを使って実装されます。私が物事をアクションや別のメソッドに分割しても、それはまだ読みにくいものに終わります。

SL4で複数のHTTP要求を連続して実行するには、誰もクリーンなソリューションを持っていますか?

実際にこのすべてを同期させるコードを同期させる必要はありませんが、各リクエストは効果的に同期する必要があるため、シリアルにリクエストする必要があります。

答えて

2

この上の私のブログの記事のカップルを見てみましょう: -

Simple Asynchronous Operation Runner – Part 1
Simple Asynchronous Operation Runner – Part 2

を、彼らは実際の実装に焦点を当てるための記事が深さに少しある、という考えではありませんこれを実現するには派手なフレームワークを含める必要があります。必要な唯一のコードは実際には記事にあり、ダウンロードする追加のdllやzipファイルはありません。

ただし、同期コーディングが可能だった場合のコードのイメージを想像するアプローチ2に注意してください。あなたのケースでは、あなたのコードは次のようになります -

void StuffToDo() 
{ 
    doFirstGet(someParams); 
    doSecondGet(someParams); 
    doThirdGet(...); 
} 

次のステップではなくAsyncOperationを返すために、「やる」メソッドの内容を変更しています。

IEnumerable<AsyncOperation> StuffToDo() 
{ 
    yield return doFirstGet(someParams); 
    // Do some other synchronous stuff here, this code won't run until doFirstGet has completed. 
    yield return doSecondGet(someParams); 
    // Do some other synchronous stuff here, this code won't run until doSecondGethas completed. 
    yield return doThirdGet(...); 
    // Do some final synchronous stuff here, this code won't run until doThirdGethas completed. 

} 

- :第三段階は、このようなあなたの想像上の同期コードを変更している

AsyncOperation doFirst(someParams) 
{ 
    return (completed) => 
    { 
     SomeAsyncObj thing = new SomeAsyncObj(); 
     thing.OnCompleted += (s, args) => 
     { 
      try 
      { 
       completed(null); 
      } 
      catch (Exception err) 
      { 
       completed(err); 
      } 
     }; 
     thing.DoSomethingAsync(source); 
    }; 
} 

- :あなたはそれを変換します

void doFirst(someParams, Action callback) 
{ 
    SomeAsyncObj thing = new SomeAsyncObj(); 
    thing.OnCompleted += (s, args) { callback() }; 
    thing.DoSomethingAsync(); 
} 

- :現在、彼らはおそらくこのような何かを見て最後にStuffToDoへの呼び出しは次のように変更されます。 -

StuffToDo().Run((err) => 
{ 
    // report any error in err sensibly 
}); 
1

この問題が発生しました。私はコルーチンが非常に有益であることを発見しました。私はJeremy LiknessとRob Eisenbergの仕事に基づいて考えました。

これはlinkです。

1
  1. 収集作成を通って各要求を処理するリクエストのコレクション又はアレイ
  2. 反復を作成クラス
  3. に各要求をカプセル化します。
関連する問題