locked
HttpWebRequestを使った同期処理について RRS feed

  • 質問

  • ChipStartといいます。
    よろしくお願いします。

    現在、Silverlight3を使ってWebアプリを開発しています。
    その中で、HttpWebRequestを使って任意のWebAPIを呼び出す処理を同期処理として実行したいと思っています。
    しかし、HttpWebRequestは非同期処理のAPIしか提供しておらず、その実現方法に苦戦しています。
    ManualResetEventを利用した同期処理を試みてみたのですが、スレッドがデッドロックしているようで、うまく実現できません。
    どなたか知恵をお持ちの方はいらっしゃらないでしょうか。
    ご教授の程、よろしくお願いいたします。

    上手くいかなかったコード例
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://127.0.0.1/");
    ManualResetEvent wait = new ManualResetEvent(false);
    req.BeginGetResponse(ar =>
    {
       ret = req.EndGetResponse(ar);<-- ここで固まる
       wait.Set();
    }, null);
    wait.WaitOne(); 
    // 結果を使った任意の処理
    2010年3月9日 15:36

回答

  • 自分も同じところで悩みました。

     

    結局、同期処理ではないですが、EndGetResponseのcallback関数から

    結果取得後の任意の処理をする関数を呼び出すようにして乗り切りました。

     

    また、Httpリクエストを複数呼び出す必要があったので(ここは非同期でよかった)

    それぞれの処理終了判定のフラグを追加して、全部終了していたら任意の処理関数

    を呼び出すようにしています。

     

    適宜invokeする必要があるので、要注意、というところでしょうか。

    参考になれば。

    ----修正

    すいません。勘違いしてました。

    EndGetResponseではなくてBeginGetResponseのcallback関数から、でした。

    EndGetResponseを呼び出した後に任意の処理関数を呼び出しています。

    2010年3月26日 8:00
  • こんにちは。

    こちらのページは参考になりませんか?

    Silverlight 2 におけるブラウザの相互運用性
    http://msdn.microsoft.com/ja-jp/magazine/dd148642.aspx#id0070076

    K.Oumi
    2010年3月11日 0:42
  • HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/");
    ManualResetEvent wait = new ManualResetEvent(false);

    IAsyncResult result = request.BeginGetResponse(_ => { wait.Set(); }, null);
    wait.WaitOne();

    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

    とか?

    # SL3 での動作は確認してません。

    2010年3月12日 4:14

すべての返信

  • こんにちは。

    こちらのページは参考になりませんか?

    Silverlight 2 におけるブラウザの相互運用性
    http://msdn.microsoft.com/ja-jp/magazine/dd148642.aspx#id0070076

    K.Oumi
    2010年3月11日 0:42
  • K.Oumiさん、返信ありがとうございます。

    紹介して頂いたWebページを拝見させて頂きました。
    このWebページでは、JavaScriptのXmlHttpRequestを利用した同期処理について記述されていますが、
    今回私がやりたいのはC#のHttpWebRequestを利用した処理となります。
    処理結果は同じかもしれませんが、目的がHttpWebReqeustを使うことにあるためです。

    このHttpWebRequestを利用した同期処理について何か情報をお持ちではないでしょうか。
    宜しくお願い致します。
    2010年3月12日 2:11
  • HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/");
    ManualResetEvent wait = new ManualResetEvent(false);

    IAsyncResult result = request.BeginGetResponse(_ => { wait.Set(); }, null);
    wait.WaitOne();

    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

    とか?

    # SL3 での動作は確認してません。

    2010年3月12日 4:14
  • 自分も同じところで悩みました。

     

    結局、同期処理ではないですが、EndGetResponseのcallback関数から

    結果取得後の任意の処理をする関数を呼び出すようにして乗り切りました。

     

    また、Httpリクエストを複数呼び出す必要があったので(ここは非同期でよかった)

    それぞれの処理終了判定のフラグを追加して、全部終了していたら任意の処理関数

    を呼び出すようにしています。

     

    適宜invokeする必要があるので、要注意、というところでしょうか。

    参考になれば。

    ----修正

    すいません。勘違いしてました。

    EndGetResponseではなくてBeginGetResponseのcallback関数から、でした。

    EndGetResponseを呼び出した後に任意の処理関数を呼び出しています。

    2010年3月26日 8:00
  • こんにちは。フォーラムオペレーターの高橋春樹です。

    K.Oumiさん、渋木宏明さん、みやびぬさん
    アドバイスの投稿、有難うございました。

    ChipStarさん
    MSDNフォーラムのご利用有難うございます。
    渋木宏明さん、みやびぬさんから、追加のアドバイスを頂いたと思うのですが、如何でしょうか?
    皆様の投稿が、有用な情報だと思いましたので、一旦回答マークを付けさせてもらいました。
    ChipStarさんの状況も気になるので、是非、皆様からの投稿に返信して頂きたいと思います。

    尚、回答マークは問題解決を意味するものではないので、その他アドバイスがありましたら
    ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年3月30日 6:02