質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3063閲覧

C#のwebBrowserを連続で動作させるとまれに発生する「次の行でメモリ不足になりました。」をなんとかしたい。

GiveAHand

総合スコア286

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/09/26 05:48

C#でWebBrowserを使ってスクレイピングをしているアプリを制作しています。

そのアプリは、プログラムの中で、webBrowserを何回もnewしていえると起こります。

イメージ説明

これは、webBrowserを使用しているとどうしようもないものなのでしょうか?

try~catchのエラーにも引っかからないので、これが発生した時に、すみやかにエラー処理ができるだけでもありがたいのですが。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。
少し調べてみましたが、「次の行でメモリ不足になりました。」のメッセージはWebBrowserの中で発生しているブラウザ側のエラーのようですね。となると、プログラム側のメモリの管理の問題ではなく、WebBrowser自体が扱えるメモリが不足している可能性があります。これを解決する方法は……ちょっと分かりません。

これは、webBrowserを使用しているとどうしようもないものなのでしょうか?

そういうことになると思います。


WebBrowserというのは本来、「ユーザーが操作するための」ブラウザウィンドウの埋め込みコンポーネントです。なので、それを複数回newするという事はありえない、「本来の使用用途ではない」ということになります。
目的が「スクレイピング」ということなので、それこそWebBrowserの使用は不適切です。C#にはHttpClientという完成されたWebインターフェースが存在するので、そちらの利用を検討してください。もし「どうしてもWebBrowserを使い続けなければならない」理由があるのならば、逆に「その理由を回避する」ように解決策を模索するべきでしょう。

投稿2016/09/26 06:37

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/09/26 07:01

tamoto様 ご回答ありがとうございます。 なるほど。 そうなんですね。。。 ちなみに、HttpClientの使い方や入門的なサイト、書籍などないでしょうか?
tamoto

2016/09/26 07:25

まずはHttpClientそのもののクラス情報から。 https://msdn.microsoft.com/ja-jp/library/system.net.http.httpclient(v=vs.110).aspx 使い方だと、まずは以下のページでしょうか。 http://www.atmarkit.co.jp/ait/articles/1501/06/news086.html このあたりのコード片も参考になると思います。 http://www.kekyo.net/2015/06/22/5119 http://ikarostech.hatenablog.com/entry/2015/05/03/162619 使い方といっても、Web上のGET、POSTに相当するメソッドにパラメータを付けて呼び出し、その結果を受け取るのをC#コード上でやるだけな話なので、難しいことはないと思います。
GiveAHand

2016/09/26 07:57

tamoto様 ご丁寧にありがとうござます。 Webページの取得方法はわかったのですが、 webBrowserで出来るような、Inputにテキストをセットしたり、ボタンをクリックしたりは、どうしたらいいのでしょう。。。
tamoto

2016/09/26 08:13

考え方を変えましょう。HttpClientは「テキストをセットしてボタンをクリックする」のように「ブラウザの操作をエミュレートする」ものではなく、「パラメータをセットしてHTTPメソッドを直接呼び出す」ものです。上記の操作なら、「テキストをセットしてボタンをクリック」した時に「実際にサーバに送信されるパラメータ」をコード上で組み立てて、それを直接Webサーバに送信します。目的がスクレイピングなら、わざわざ人間の操作を一から再現する必要はないはずです。
GiveAHand

2016/09/26 08:47

tamato様 ご回答ありがとうございます。 なるほど、そうなんですね。 では、 「一旦ログインしてから、ログイン中画面のフォームに入力データをセットしてsubmitする」 みたいな動作はどうしたらいいのですか?
tamoto

2016/09/26 12:18

ログインはHTTPのセッション情報ですね。HttpClientはHttpClientHandlerをいじることでセッション情報を管理できるようになるので、それを使用してログイン情報を保管すればいいでしょう。ここから先はWebサービスとHTTPの話になるので、まずは一通り調べてみてください。WebBrowserで出来ることはHttpClientでも出来ると思っていいです。
GiveAHand

2016/09/26 12:19

tamoto様 いろいろとありがとうございました。 調べてみます。
guest

0

そのアプリは、プログラムの中で、webBrowserを何回もnewしていえると起こります。

そういうことをすれば当たり前という気がします。

MSDN ライブラリを読みましたか? 以下のように書いてあるはずです。

"WebBrowser は、リソースへの負荷の大きいコントロールです。コントロールの使用を終えたら、必ず Dispose() メソッドを呼び出し、すべてのリソースを確実に解放するようにしてください"

どうしても「webBrowserを何回もnew」する必要があるのかをよく考えて、そういうことをしないで済むように実装を考え直す余地はないのですか?

投稿2016/09/26 06:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/09/26 06:36

SueferOnWww様 ご回答ありがとうございます。 >"WebBrowser は、リソースへの負荷の大きいコントロールです。コントロールの使用を終えたら、必ず Dispose() メソッドを呼び出し、すべてのリソースを確実に解放するようにしてください" こちらの件なのですが、実際には、 WebBrowserコントロールによりWebページからリンクや画像を抽出するには?[2.0のみ、C#、VB] http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html 、このサイトのように、サブクラス化して、それを何度もループしているのですがいるのですが、それでもやっぱり同じ事なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/09/26 10:04

Application.DoEvents(); をループで回しているのが諸悪の根源ではないかと思います。そういうコードをよく見ますが、それに従って作って問題を起こしているケースは結構あるようです。そういうのを見たらその記事は信用しない方がいいと個人的には思います。DocumentCompleted イベントを使いましょう。
GiveAHand

2016/09/26 11:33

SureferOnWww様 Application.DoEvents();をループで回すのが諸悪の根源なのですか??
退会済みユーザー

退会済みユーザー

2016/09/26 12:34

Web サイトや回線の状況によっては、いつまで待っても応答が返ってこない or 時間がかかる場合があります。その場合、done はいつまで経っても false のままのはずで、while は無限ループになります。その無限ループの中で DoEvents が際限なく実行されるのは、どう考えても良い影響があるとは思えません。MSDN フォーラムでも、スタックオーバーフローしたなどの問題が報告されています。webbrowser doevents などをキーワードに検索してみてください。
GiveAHand

2016/09/26 12:40

SurferOnWww様 あぁ、なるほど。 そういう事なんですね! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問