在现代软件开发中,桌面应用程序的性能和用户体验至关重要。随着技术的发展,经常需要更新应用程序以使用更高效、更稳定的组件。本文将探讨一个桌面应用程序从使用WebBrowser组件迁移到使用Adobe PDF Reader组件进行PDF文档预览的过程,以及如何解决迁移后出现的关闭延迟问题。
在迁移之前,桌面应用程序使用WebBrowser组件来预览PDF文档。然而,随着用户需求的增长和对性能要求的提高,决定迁移到Adobe PDF Reader的COM组件(axAcroPDF),以期获得更好的性能和用户体验。
迁移到Adobe PDF Reader后,遇到了一个新问题:预览对话框在文档关闭后需要额外的x秒才能关闭。这导致用户界面看起来像是卡住了,甚至像是应用程序崩溃了,这对用户体验非常不利。
为了解决这个问题,开发了一个解决方案,它可以关闭PDF文档并终止与父窗体应用程序相关的Adobe进程。这样,所有其他PDF文档或Adobe进程将保持活动状态。
首先,需要获取当前应用程序进程ID(父进程ID)。以下代码段展示了如何使用System.Management命名空间来实现这一点:
private static int GetParentProcessId(Process p)
{
int parentId = 0;
try
{
ManagementObject mo = new ManagementObject("win32_process.handle='" + p.Id + "'");
mo.Get();
parentId = Convert.ToInt32(mo["ParentProcessId"]);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
parentId = 0;
}
return parentId;
}
如果文档包含标题,以下逻辑使用iTextSharp库来查询PDF文档:
private static void getDocumentTitle()
{
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(documentPath);
documentTitle = reader.Info["Title"];
}
以下方法用于终止单个进程:
private static void killSingleProcess(Process process)
{
try
{
if (process != null)
{
process.Kill();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static void Adobe(string path)
{
documentPath = path;
Utilities.DebugSolution.SetMessageUniqueFile("Printing", "Kill Adobe process");
try
{
processes = Process.GetProcessesByName("AcroRd32");
var desktopProcess = Process.GetProcessesByName("[DESKTOP PROCESS NAME]");
getDocumentTitle();
if (desktopProcess != null || desktopProcess.Count() > 0)
{
var desktopProcessId = hdProcess[0].Id;
foreach (Process process in processes.Where(x => x.MainWindowTitle.Equals(documentTitle, StringComparison.OrdinalIgnoreCase) || x.MainWindowTitle.Equals(""))
{
var parentProcess = GetParentProcessId(process);
if (parentProcess.Equals(desktopProcessId))
{
killSingleProcess(process);
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}