承接上篇,本文展示如何在 ASP.NET 中以異步線程調用截圖類,並通過標誌位回傳截圖狀態,避免阻塞主線程。
protected bool SaveOriginalPageToImage(Guid myGuid)
{
guid = myGuid;
if (this.CurrentPageAct == PageAct.Edit)
{
string pagePath = Request.Url.LocalPath.Replace("Operation", "Capture");
UrlPath = pagePath + "?act=view&ProjectNo=" + _projectNo;
Thread newTh = new Thread(CaptureImage);
newTh.SetApartmentState(ApartmentState.STA); // WebBrowser 需 STA
newTh.Start();
while (newTh.ThreadState == ThreadState.Running) { /* 等待 */ }
return CaptureState;
}
return false;
}
public void CaptureImage()
{
try
{
string url = "https://" + Request.Url.Host + ":" + Request.Url.Port + UrlPath;
GetImage thumb = new GetImage(url, 1024, 1200, 1024, 1200);
Bitmap x = thumb.GetBitmap();
string fileName = DateTime.Now.ToString("yyyyMMddhhmmss");
x.Save(Server.MapPath("~/Capture/SavePage") + "\\" + guid + ".jpg");
CaptureState = true;
}
catch (Exception ex)
{
CaptureState = false;
}
}
ApartmentState.STA,否則 WebBrowser 控件會拋出異常。Guid 命名文件,避免併發衝突。Task.Run + async/await 替代阻塞等待,提升併發性能。