2012-04-27 4 views
2

だから私は、コールバックで非同期Webリクエスト方法があります。どのように再帰的なコールバックパターンを実装するには?

private void DoWebRequest(string url, string titleToCheckFor, 
          Action<MyRequestState> callback) 
{ 
    MyRequestState result = new MyRequestState(); 
    // ... 
    // a lot of logic and stuff, and eventually return either: 
    result.DoRedirect = false; 
    // or: 
    result.DoRedirect = true; 
    callback(result); 
} 

(ただ、アップフロント、それを指摘して、私のWebRequest.AllowAutoRedirectは多くの理由から、falseに設定されている)

Iドンそれはバックへの最後のコールバックを行いますので、私は反復ループで、これは置くことができるか、

private void MyWrapperCall(string url, string expectedTitle, 
          Action<MyRequestState> callback) 
{ 
    DoWebRequest(url, expectedTitle, new Action<MyRequestState>((a) => 
    { 
     if (a.DoRedirect) 
     { 
     DoWebRequest(a.Redirect, expectedTitle, new Action<MyRequestState>((b) => 
     { 
      if (b.DoRedirect) 
      { 
      DoWebRequest(b.Redirect, expectedTitle, callback); 
      } 
     })); 
     } 
    })); 
} 

そして今、私は、脳のメルトダウンを得た:「tは私が期待することができますどのように多くのリダイレクト手の前に知っているので、私が始めましたリダイレクトが必要ない場合は元の呼び出し元anymor e?

答えて

4

ストア再帰メソッドへの参照、それは自分自身を呼び出すことができるように:

private void MyWrapperCall(string url, string expectedTitle, Action<MyRequestState> callback) 
{ 
    Action<MyRequestState> redirectCallback = null; 
    redirectCallback = new Action<MyRequestState>((state) => 
    { 
     if(state.DoRedirect) 
     { 
      DoWebRequest(state.Redirect, expectedTitle, redirectCallback); 
     } 
     else 
     { 
      callback(state); 
     } 
    }); 

    DoWebRequest(url, expectedTitle, redirectCallback); 
} 
+0

まあはあなたの先生に感謝します!素晴らしいとエレガントな、それは同様に動作する上に... –

関連する問題