html ページのスクリーンショットを取得するサイクルで、アプリケーションが占有するメモリの数が増えるのはなぜですか? やればやるほどボリュームが増します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Forms;
namespace ConsoleAppScreenShot
{
class Program
{
static String pathApp = System.Windows.Forms.Application.StartupPath.ToString();
static string url = "http://www.ya.ru";
static int width = 960, height = 1380;
static bool isDownloadScreenComplete = false;
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("hi");
try
{
for (int i = 0; i < 100; i++)
{
isDownloadScreenComplete = false;
RunGenerateScreenshotThread(url, i);
int number = 0;
while (!isDownloadScreenComplete) // 5-ти минутный цикл ожидания скрина
{
Thread.Sleep(100);
if (number > 3000)
throw new Exception(string.Format(" Ошибка цикла ожидания потока закачки снимка экрана. Ожидание составляет: {0} минут.", (number / 600).ToString()));
number++;
}
}
Console.ReadKey(true);
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: {0}", ex.Message);
}
}
static void RunGenerateScreenshotThread(string url, int count)
{
var th = new Thread(() =>
{
WebBrowser wb = new WebBrowser();
// Set the size of the WebBrowser control
wb.Width = width;
wb.Height = height;
//wb.DocumentCompleted += GenerateScreenshotCompleted;
wb.Navigate(url);
while (wb.ReadyState != WebBrowserReadyState.Complete) { System.Windows.Forms.Application.DoEvents(); }
try
{
// Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
wb.Dispose();
// Save Thumbnail to a File
bitmap.Save(string.Format("d:\\1\\Screenshot{0}.png", count), System.Drawing.Imaging.ImageFormat.Png);
bitmap.Dispose();
count++;
Console.WriteLine("Natigated to OK {0}", count);
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: {0}", ex.Message);
}
finally
{
isDownloadScreenComplete = true;
Application.ExitThread(); // Stops the thread
}
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
}
}
繰り返しが約 5 分間ハングした後の WebBrowser のフロー:
while (wb.ReadyState != WebBrowserReadyState.Complete)
{ System.Windows.Forms.Application.DoEvents(); }
状態の値は次のとおりです。
wb.ReadyState == Uninitialized or Interactive
最終的に「ナビゲーションがキャンセルされました」というページが返されるか、5 分の遅延が返されます。
- システムが IE8 の場合、WebBrowser コンポーネントが 7 番目のバージョンとして IE を使用するのはなぜですか?
- WebBrowser コンポーネントがページを提供しなくなるのはなぜですか?
- アプリケーションの結果、メモリ量が増加し、約 800 MB かかるのはなぜですか?
私のタスクは、コンソール アプリケーションを使用して、表示されているページをハード ドライブに保存することです。おそらく、ページの HTML コンテンツを表示できるように、PDF 形式で保存することができます。
貴重なご意見をいただければ幸いです。
class Program
{
static string url = "http://www.whatbrowser.org";
static int width = 960, height = 1380;
static int count = 0;
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("hi");
try
{
int number = 1000;
for (int i = 0; i < number; i++)
{
var th = new Thread(obj => RunGenerateScreenshotThread((string)obj));
th.SetApartmentState(ApartmentState.STA);
th.Start(url);
th.Join();
count++;
}
Console.WriteLine("All successfully completed!");
Console.ReadKey(true);
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
}
static void RunGenerateScreenshotThread(string url)
{
try
{
using (WebBrowser wb = new WebBrowser())
{
// Set the size of the WebBrowser control
wb.Width = width;
wb.Height = height;
wb.Navigate(url);
while (wb.ReadyState != WebBrowserReadyState.Complete)
{ System.Windows.Forms.Application.DoEvents(); }
if (wb.DocumentTitle == "Navigation Canceled")
Console.WriteLine("Natigated ERROR {0}", count);
else
Console.WriteLine("Natigated OK {0}", count);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
finally
{
Application.ExitThread(); // Stops the thread
}
}
}