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に設定されています)

予想できるリダイレクトの数が事前にわからないため、次のように開始しました。

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);
          }
        }));
      }
    }));
}

そして今、私は脳のメルトダウンを取得しました、これを反復ループに入れて、リダイレクトがもう必要ない場合に元の呼び出し元に最後のコールバックを戻すにはどうすればよいですか?

4

1 に答える 1

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);
}
于 2012-04-27T14:04:22.690 に答える