1

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 分の遅延が返されます。

  1. システムが IE8 の場合、WebBrowser コンポーネントが 7 番目のバージョンとして IE を使用するのはなぜですか?
  2. WebBrowser コンポーネントがページを提供しなくなるのはなぜですか?
  3. アプリケーションの結果、メモリ量が増加し、約 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
    }
}
}
4

0 に答える 0