WebBrowserで画像の多いHTMLを表示させるとメモリ不足 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 ヴァン  (社会人)
投稿日時
2016/4/26 17:47:16
こんにちは。
この様な記事を見つけました。
参考にしてみてください。
http://quickprogram.blogspot.jp/2013/09/net-webbrowserdispose.html
この様な記事を見つけました。
参考にしてみてください。
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
ただし、最初に表示されていたはずの画像が表示されない(真っ白になる)という問題は
残ったままなので、もう少し調べてみます。
メモリ不足は回避できました。
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ビットアプリとして作るのが良いかと...
ダメでしたか。
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
もしかしたらこの方法自体が見当違いなのかも知れませんが、
いったい何をすればいいのか分かりません。
何かアドバイスがあれば、どうぞよろしくお願い申し上げます。
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/
このあたりを参考にしてメモリを解放してみるとか...
http://uchukamen.com/Programming/GC/
投稿者 ヨハン  (社会人)
投稿日時
2016/4/14 16:47:58
daive 様、コメントありがとうございます。
そういえば、使用OSの情報を記載しておりませんでした。申し訳ございません。
OSはWindows 7の32ビットです。
他に何か手掛かりがあれば、どうぞよろしくお願い申し上げます。
そういえば、使用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とは別な形に
なるはずです。
>そこで、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は結構縦に長くなるため、もしかしたら、
リサイズ時に、スクロール位置の計算なんかでたくさんのメモリを食ってしまうのでしょうか?
頻繁に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の違い
(メモリ管理の違い)なのでしょうか?
また、アドバイスを頂きましてありがとうございました。
早速、対象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を設定すると改善されるかは試す価値があると思います。
根本的には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は違うのでしょうか?
とりえずは、表示用のHTMLファイルと画像ソースはローカルに保存されているものを使い
表示までは上手くいきました。
ただ、これで画像数が数百もあるHTMLを表示すると、
画面サイズを変更(それにつられてWebBrowserもリサイズ)すると
最初に表示されていたはずの画像が表示されず(真っ白になる)、
しまいには、以下のようにメモリ不足と言われてしまいます。
「System.OutOfMemoryException: プログラムの実行を続行するための十分なメモリがありませんでした。」
そこで、IE(IE11)で同じHTMLを表示してみましたが、ウィンドウサイズを色々と変えたり
スクロールを頻繁に行っても、特に何の問題もありませんでした。
根本的にIEとWebBrowserは違うのでしょうか?
しかしながら、今回の問題は、WebBrowserのDispose以前の問題
(バリバリにActiveの時の問題)なので、
残念ながら今回のケースでは利用できそうにありません。
ただし、先ほどの自己レスでのmicrosoftのフォーラムにあった方法は
今回のケースでは効果てきめんだったようです。
また、画像が表示されない(真っ白になる)という問題は、
色々と試した結果、WebBrowserのRefreshを行えば解消するようです。
ただ、画像数が数百もあるためか、Refreshによる再表示には
どうしても時間がかかります。
今後は、画像が表示されない情況では何が起こっているのかを
検証していきたいと思います。
また何か分かりましたら、報告いたします。