WebBrowserで画像の多いHTMLを表示させるとメモリ不足 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ヨハン  (社会人) 投稿日時 2016/4/26 20:23:33
ヴァン様、情報提供ありがとうございます。
しかしながら、今回の問題は、WebBrowserのDispose以前の問題
(バリバリにActiveの時の問題)なので、
残念ながら今回のケースでは利用できそうにありません。

ただし、先ほどの自己レスでのmicrosoftのフォーラムにあった方法は
今回のケースでは効果てきめんだったようです。
また、画像が表示されない(真っ白になる)という問題は、
色々と試した結果、WebBrowserのRefreshを行えば解消するようです。

ただ、画像数が数百もあるためか、Refreshによる再表示には
どうしても時間がかかります。
今後は、画像が表示されない情況では何が起こっているのかを
検証していきたいと思います。

また何か分かりましたら、報告いたします。 
投稿者 ヴァン  (社会人) 投稿日時 2016/4/26 17:47:16
こんにちは。

この様な記事を見つけました。
参考にしてみてください。

http://quickprogram.blogspot.jp/2013/09/net-webbrowserdispose.html
投稿者 ヨハン  (社会人) 投稿日時 2016/4/26 10:53:16
あれから色々と調べて、以下のサイトに記載の方法をVBにアレンジして、
メモリ不足は回避できました。

https://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control?forum=ieextensiondevelopment

Imports System.Runtime.InteropServices

Public Class Form1
    <DllImport("KERNEL32.DLL", EntryPoint:="SetProcessWorkingSetSize", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _
    Private Shared Function SetProcessWorkingSetSize(ByVal pProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Integer, ByVal dwMaximumWorkingSetSize As Integer) As Boolean
    End Function

    <DllImport("KERNEL32.DLL", EntryPoint:="GetCurrentProcess", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _
    Private Shared Function GetCurrentProcess() As IntPtr
    End Function

    '途中略

    Private Sub wb_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles wb.Resize
        Dim pHandle As IntPtr = GetCurrentProcess()
        SetProcessWorkingSetSize(pHandle, -1, -1)
    End Sub
End Class

ただし、最初に表示されていたはずの画像が表示されない(真っ白になる)という問題は
残ったままなので、もう少し調べてみます。
投稿者 ヴァン  (社会人) 投稿日時 2016/4/19 09:41:40
こんにちは。

ダメでしたか。

OSを64ビットにして、64ビットアプリとして作るのが良いかと...

投稿者 ヨハン  (社会人) 投稿日時 2016/4/18 15:47:48
ヴァン様よりご紹介頂いたサイトを読んでみましたが、
System.GC.Collect()を実行する、ということなのでしょうか?

以下のようにリサイズ時のイベントを書いてみましたが、
結果は変わらず、最終的にはフリーズします。

Private Sub wb_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles wb.Resize
    System.GC.Collect()
End Sub

もしかしたらこの方法自体が見当違いなのかも知れませんが、
いったい何をすればいいのか分かりません。

何かアドバイスがあれば、どうぞよろしくお願い申し上げます。
投稿者 ヨハン  (社会人) 投稿日時 2016/4/15 17:20:51
ヴァン様、コメントありがとうございます。

ご紹介頂いたサイトで勉強させて頂きます。
また何か分かりましたら、報告いたします。
投稿者 ヴァン  (社会人) 投稿日時 2016/4/15 10:11:30
こんにちは。

このあたりを参考にしてメモリを解放してみるとか...

http://uchukamen.com/Programming/GC/

投稿者 ヨハン  (社会人) 投稿日時 2016/4/14 16:47:58
daive 様、コメントありがとうございます。
そういえば、使用OSの情報を記載しておりませんでした。申し訳ございません。
OSはWindows 7の32ビットです。

他に何か手掛かりがあれば、どうぞよろしくお願い申し上げます。
投稿者 daive  (社会人) 投稿日時 2016/4/14 13:50:49
あてずっぽうですが、
>そこで、IE(IE11)で同じHTMLを表示してみましたが、ウィンドウサイズを色々と変えたり
64ビット版ではありませんか?
 OSによって、x32(x86) / x64 何れかが標準なのかは、変わります。
 ヘルプのバージョンで確認できない場合は、
実行パスが、
C:\Program Files (x86)の場合、
 OS x64 で、x32(x86) のプログラムをWOWで動かしている。
C:\Program Filesの場合、
 OS x32 で、x32(x86) のプログラムを動かしている。
 OS x64 で、x64 のプログラムを動かしている。
 但し、Online版OFFICEの様に、x32版であるにも関わらず、
 インストール先がC:\Program Files\ の下になるものも、確認しています。

>WebBrowser
は、コンパイル時のターゲットとするプラットフォームにより、
Any / x86 / x64 
の何れかになると思います。
Any の場合は、実行OSにより変わります。 

操作や、動作の為のヒープや、スタックは、
VS20xx で行っている場合は、IE11とは別な形に
なるはずです。


投稿者 (削除されました)  () 投稿日時 2016/4/14 13:41:58
(削除されました)
投稿者 ヨハン  (社会人) 投稿日時 2016/4/14 10:03:02
あれから色々と検索してみましたが、結局分からず仕舞いでした。

頻繁にNavigateを行っているわけではなく、WebBrowserのリサイズを行っているだけなのですが、
表示させるHTMLは結構縦に長くなるため、もしかしたら、
リサイズ時に、スクロール位置の計算なんかでたくさんのメモリを食ってしまうのでしょうか?
投稿者 ヨハン  (社会人) 投稿日時 2016/4/5 17:01:30
るきお様、いつもこちらのサイトを参考にさせて頂いており、助かっております。
また、アドバイスを頂きましてありがとうございました。

早速、対象HTMLに以下のメタタグを入れたものをWebBrowserに読み込んでみましたが、
改善されませんでした。
Navigateは上手くいくのですが、画面サイズの変更(それにつられてWebBrowserもリサイズ)
を何回か行うとフリーズしました。

<meta http-equiv="X-UA-Compatible" content="IE=edge">


また、以下のサイトに記載の方法も試してみましたが、結果は同じでした。

https://www.ipentec.com/document/document.aspx?page=csharp-change-webbrower-control-internet-explorer-version

これはIEのバージョンの問題ではなく、根本的なIEとWebBrowserの違い
(メモリ管理の違い)なのでしょうか?
投稿者 るきお  (社会人) 投稿日時 2016/4/4 21:10:32
こんにちは。

根本的にはWebブラウザーコントロールはその環境にインストールされているIEと同じようです。
しかし、固定でドキュメントモードIE7をを使用しているようです。

そのHTMLにX-UA-CompatiubleでIE=edgeを設定すると改善されるかは試す価値があると思います。
<meta http-equiv="X-UA-Compatible" content="IE=edge">
投稿者 ヨハン  (社会人) 投稿日時 2016/4/4 13:37:14
VB2008で、WebBrowserを利用して、HTML表示用の画面を作成しています。
とりえずは、表示用のHTMLファイルと画像ソースはローカルに保存されているものを使い
表示までは上手くいきました。

ただ、これで画像数が数百もあるHTMLを表示すると、
画面サイズを変更(それにつられてWebBrowserもリサイズ)すると
最初に表示されていたはずの画像が表示されず(真っ白になる)、
しまいには、以下のようにメモリ不足と言われてしまいます。

「System.OutOfMemoryException: プログラムの実行を続行するための十分なメモリがありませんでした。」

そこで、IE(IE11)で同じHTMLを表示してみましたが、ウィンドウサイズを色々と変えたり
スクロールを頻繁に行っても、特に何の問題もありませんでした。
根本的にIEとWebBrowserは違うのでしょうか?