トップ回答者
HttpWebRequestを使った同期処理について

質問
-
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(); // 結果を使った任意の処理
- 編集済み chipstar_light 2010年3月14日 6:34
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月30日 6:00
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月30日 6:00
2010年3月12日 4:14
すべての返信
-
こんにちは。
こちらのページは参考になりませんか?
Silverlight 2 におけるブラウザの相互運用性
http://msdn.microsoft.com/ja-jp/magazine/dd148642.aspx#id0070076
K.Oumi- 回答としてマーク 高橋 春樹 2010年3月30日 6:00
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月30日 6:00
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