gpt4 book ai didi

c# - 线程在 2 分钟后什么都不做

转载 作者:行者123 更新时间:2023-11-30 17:47:00 24 4
gpt4 key购买 nike

我需要捕获 apsx 表单的缩略图,我可以用下面的代码来完成。但问题是我有大约 12000 个表单要捕获,我的代码运行了大约 2 分钟并捕获了 1500 个缩略图并停止执行不给出任何异常或错误。请帮忙。

    private Bitmap GenerateThumbnail(string Url, int BrowserWidth, int BrowserHeight,    int ThumbnailWidth, int ThumbnailHeight)
{
this.Url = Url;
this.BrowserWidth = BrowserWidth;
this.BrowserHeight = BrowserHeight;
this.Height = ThumbnailHeight;
this.Width = ThumbnailWidth;

Thread thread = new Thread(new ThreadStart(GenerateThumbnailInteral));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
return ThumbnailImage;
}
private void GenerateThumbnailInteral()
{
System.Windows.Forms.WebBrowser webBrowser = new System.Windows.Forms.WebBrowser();
webBrowser.ScrollBarsEnabled = false;
webBrowser.Navigate(this.Url);
webBrowser.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
while (webBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
webBrowser.Dispose();
}
private void WebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
System.Windows.Forms.WebBrowser webBrowser = (System.Windows.Forms.WebBrowser)sender;
webBrowser.ClientSize = new Size(this.BrowserWidth, this.BrowserHeight);
webBrowser.ScrollBarsEnabled = false;
this.ThumbnailImage = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height);
webBrowser.BringToFront();
webBrowser.DrawToBitmap(ThumbnailImage, webBrowser.Bounds);
this.ThumbnailImage = (Bitmap)ThumbnailImage.GetThumbnailImage(Width, Height, null, IntPtr.Zero);
this.ThumbnailImageSmall = (Bitmap)ThumbnailImage.GetThumbnailImage(200, 200, null, IntPtr.Zero);
}
private void SaveImageThumbnail(List<FormClass> objFormClass)
{
try
{
string url = string.Empty;
string folderName = string.Empty;
foreach (FormClass form in objFormClass)//12000 forms
{
InternetSetCookie(url, authCookieName, authCookieValue);
InternetSetCookie(url, "RP_si", rsiCookieValue);
filepath = "D:\\Previews\\";
folderName = form.FormId.ToString();
url = string.Format("http://localhost/CRM/Sockets/{0}", form.FileName);
if (!Directory.Exists(filepath + folderName))
{
Directory.CreateDirectory(filepath + folderName);
}
Bitmap image = GenerateThumbnail(url, 1024, 700, 600, 500);
image.Save(string.Format("{0}{1}/{2}-medium.jpg", filepath, folderName, form.FormId), System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
catch (Exception exp)
{
Logger.Error("Unhandled Exception", exp);
}
}
public bool SaveThumbnails(string filePath, string authCookieName, string authCookieValue, string rpsiCookieValue)
{
this.authCookieName = authCookieName;
this.authCookieValue = authCookieValue;
this.rsiCookieValue = rpsiCookieValue;
this.filepath = filePath;
try
{
List<FormClass> globalForms = formRepo.GetForms().ToList();//Returns 12000 forms from database
SaveImageThumbnail(globalForms.ToList());
return true;
}
catch (Exception ex)
{
Logger.Error(ex.Message, ex);
}
}

在 Controller 中,我这样调用这个方法。

    public void SaveThumbnailImage(string Guid)
{
try
{
var formsService = SvcUnityContainer.DefaultContainer.WithStandardMappings().Resolve<IFormsService>();
new Thread(() => formsService.SaveThumbnails("D:\\Previews\\", FormsAuthentication.FormsCookieName, HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName].Value, HttpContext.Request.Cookies["RP_si"].Value)).Start();
}
catch (Exception exp)
{
Logger.Error(exp.Message, exp);
}
}

最佳答案

600 x 500 x 1500 = 450000000 像素,即 1350 兆字节的像素数据(每个像素 3 个字节)。

进程内存不足。

处理位图很重要。一旦所有内存都被认领并且垃圾收集器开始释放它,您将遇到延迟,但该过程应该会在一段时间后继续。

改变这个:

Bitmap image = GenerateThumbnail(url, 1024, 700, 600, 500);
image.Save(
string.Format("{0}{1}/{2}-medium.jpg", filepath, folderName, form.FormId),
System.Drawing.Imaging.ImageFormat.Jpeg);

为此:

using(Bitmap image = GenerateThumbnail(url, 1024, 700, 600, 500))
{
image.Save(
string.Format("{0}{1}/{2}-medium.jpg", filepath, folderName, form.FormId),
System.Drawing.Imaging.ImageFormat.Jpeg);
}

附带说明:您可能需要考虑重新使用相同的网络浏览器,这可能有助于加快程序速度。如果您可以(干净地)重新使用它,连续 1500 次实例化和处理 Web 浏览器可能是浪费时间。

关于c# - 线程在 2 分钟后什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com