使用asp.net中的webbrowser将html页面转换为图像花费太多时间来生成重型html页面的图像

我有一个问题,当我使用webbrowser将html页面转换为图像时,它需要花费太多时间来处理繁重的html页面。

它适用于小型HTML页面,但是当html页面很重,那么它就会陷入其中

Application.DoEvent(); function

WebBrowser m_WebBrowser = new WebBrowser(); m_WebBrowser.ScriptErrorsSuppressed = true; m_WebBrowser.ScrollBarsEnabled = false; m_WebBrowser.Navigate(m_Url); m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete) **Application.DoEvents();** m_WebBrowser.Dispose(); 

在创建HTML页面之后,我们将html页面的URL传递给此GetWebSiteThumbnail()函数。 码:

 public class WebsiteThumbnailImageGenerator { public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight) { WebsiteThumbnailImage thumbnailGenerator = new WebsiteThumbnailImage(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight); return thumbnailGenerator.GenerateWebSiteThumbnailImage(); } private class WebsiteThumbnailImage { public WebsiteThumbnailImage(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight) { this.m_Url = Url; this.m_BrowserWidth = BrowserWidth; this.m_BrowserHeight = BrowserHeight; this.m_ThumbnailHeight = ThumbnailHeight; this.m_ThumbnailWidth = ThumbnailWidth; } private string m_Url = null; public string Url { get { return m_Url; } set { m_Url = value; } } private Bitmap m_Bitmap = null; public Bitmap ThumbnailImage { get { return m_Bitmap; } } private int m_ThumbnailWidth; public int ThumbnailWidth { get { return m_ThumbnailWidth; } set { m_ThumbnailWidth = value; } } private int m_ThumbnailHeight; public int ThumbnailHeight { get { return m_ThumbnailHeight; } set { m_ThumbnailHeight = value; } } private int m_BrowserWidth; public int BrowserWidth { get { return m_BrowserWidth; } set { m_BrowserWidth = value; } } private int m_BrowserHeight; public int BrowserHeight { get { return m_BrowserHeight; } set { m_BrowserHeight = value; } } public Bitmap GenerateWebSiteThumbnailImage() { Thread m_thread = new Thread(new ThreadStart(_GenerateWebSiteThumbnailImage)); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } private void _GenerateWebSiteThumbnailImage() { WebBrowser m_WebBrowser = new WebBrowser(); m_WebBrowser.ScrollBarsEnabled = false; m_WebBrowser.Navigate(m_Url); m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); m_WebBrowser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser m_WebBrowser = (WebBrowser)sender; m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight); m_WebBrowser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height); m_WebBrowser.BringToFront(); m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds); m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero); } } 

我稍微改变了你的类,它现在使用async / await而不是busy-waiting。

你可以用它

 var th = new WebsiteThumbnailImage("http://www.google.com", 1024, 768, 256, 192); this.BackgroundImage = await th.GenerateWebSiteThumbnailImage(); 

 class WebsiteThumbnailImage { public WebsiteThumbnailImage(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight) { this.Url = Url; this.BrowserWidth = BrowserWidth; this.BrowserHeight = BrowserHeight; this.ThumbnailHeight = ThumbnailHeight; this.ThumbnailWidth = ThumbnailWidth; } public string Url { set; get; } public int ThumbnailWidth { set; get; } public int ThumbnailHeight { set; get; } public int BrowserWidth { set; get; } public int BrowserHeight { set; get; } private Bitmap m_Bitmap = null; public Bitmap ThumbnailImage { get { return m_Bitmap; } } public Task GenerateWebSiteThumbnailImage() { var tcs = new TaskCompletionSource(); WebBrowserDocumentCompletedEventHandler completed = null; WebBrowser m_WebBrowser = new WebBrowser(); completed = (o, s) => { _GenerateWebSiteThumbnailImageInternal(m_WebBrowser); m_WebBrowser.DocumentCompleted -= completed; m_WebBrowser.Dispose(); tcs.TrySetResult(m_Bitmap); }; m_WebBrowser.ScrollBarsEnabled = false; m_WebBrowser.ScriptErrorsSuppressed = true; m_WebBrowser.DocumentCompleted += completed; m_WebBrowser.Navigate(Url); return tcs.Task; } private void _GenerateWebSiteThumbnailImageInternal(WebBrowser m_WebBrowser) { m_WebBrowser.ClientSize = new Size(this.BrowserWidth, this.BrowserHeight); m_WebBrowser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height); m_WebBrowser.BringToFront(); m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds); m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(ThumbnailWidth, ThumbnailHeight, null, IntPtr.Zero); } }