- ベストアンサー
C#でHTTPリクエスト時にフリーズする
- C#でGUIを作成して、WEBサーバー上のPHPで作った簡易APIにPOSTしてサーバー側にデータを溜め込み、GUIのチャットをつくっています。しかし、連続ポストすると3の倍数の回数目のPOSTのみフリーズしてしまいます。問題を解消して問題なく連続POSTができるようにしたいです。
- 質問者はC#でGUIを作成しており、GUI上のフォームからテキストを入力してサーバー側のPHPへPOSTしログとしてためることができました。しかし、連続ポスト時に3の倍数の回数目のPOSTのみフリーズしてしまう問題が発生しています。どのようにすれば問題を解消できるでしょうか?
- C#でGUIのチャットアプリを作成していますが、連続ポスト時に3の倍数の回数目のPOSTのみフリーズしてしまいます。フリーズが発生している間はPOSTが完了するまでに時間がかかるため、問題を解消して問題なく連続POSTができるようにしたいです。ソースコードは提供されています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
UIスレッドで時間のかかる処理を行うことをやってはいけません。 時間がかかるならば非同期処理を行う必要があります。 ・.NET 4.5~の場合 async/awaitを使うのが簡単でしょう。 コンパイラが頑張ってステートマシンを作ってくれて,処理のほとんどをUIスレッドで処理を実行してくれます。 # かつ,Networkアクセスは非同期 http://msdn.microsoft.com/ja-jp/library/hh156513 http://msdn.microsoft.com/ja-jp/library/system.net.webrequest.getresponseasync ・.NET 2.0~の場合 本来なら,以下の.NET 1.0~の場合と同じ方法がよいのですが, UI弄るのが面倒なので,BackgroundWorkerを使うのが簡単です。 # .NET 4.0だとRxという解もあるけれども省略。 http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker ・.NET 1.0~の場合 WebRequest.BeginGetResponseとWebRequest.EndGetResponseを使ったパターンを使うことになります。 UI弄るのは面倒ですが,Control.Invokeを使ってUIスレッドで実行するように書く必要があります。 http://msdn.microsoft.com/ja-jp/library/system.net.httpwebrequest.begingetresponse http://msdn.microsoft.com/ja-jp/library/zyzhdc6b
その他の回答 (1)
- toro-nekomata
- ベストアンサー率45% (24/53)
Webサーバー等にリクエストを出した時には, たいていレスポンスが返ってくるまで,時間がかかってくるものだと思うから ある程度のフリーズは,やむを得ないと思いますし, 高速にリクエストを出し続けたら,サーバー側が耐えられなくなるんじゃないですかね. とにかく連続して出したいなら, マルチスレッドにするか, もしかしたら, HttpWebRequestのProxy プロパティをnullに設定すると, 多少改善するかも.
お礼
GUIとは別に、WEBサーバー側へ データをPOSTする処理だけThreadクラスを用いて別スレッドとして処理しました。 >UI弄るのは面倒ですが,Control.Invokeを使ってUIスレッドで実行するように書く必要があります。 というのは、メインスレッド上のフォーム要素に別スレッドから何かしらメインスレッド上のフォームにアクセスする場合に用いれるものですね。 面倒なときは、別スレッドで実行するデリゲートの中身をまるっとControls.Invoke()で ラップしてやるといいんですね。 本来はInvokeRequiredで ちゃんと条件わけしてやるのがよいのでしょうけど「・・・。