gpt4 book ai didi

c# - System.Diagnostics.Process.HasExited 始终返回 true 并且 Process.Exited 事件处理程序始终在进程仍处于打开状态时命中

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:04 26 4
gpt4 key购买 nike

我目前的一段代码有问题。当我通过 Visual Studio 2013 运行它以及使用 ClickOnce 发布时,这段代码在我的机器上运行得非常好(即使没有一些额外的 if 语句)。在客户端机器上,进程退出的事件处理程序捕获,进程 ID 正确,并且 process.hasExited 在进程仍处于打开状态时返回 true。该过程打开一个 pdf 供他们签名,并等待他们保存并关闭它,然后再继续。它使用 Adob​​e Acrobat Reader DC。

收到的错误消息来自事件处理程序方法的 catch block :

System.IO.IOException: 该进程无法访问该文件,因为它正被另一个进程使用。

这发生在调用 getReaders_NewHire(emp) 时。

这是打开进程的方法:

private void pdfAndEmail(Employee employee, Requirements requirements)
{
try
{
PDFUtility pdfu = new PDFUtility();
pdfu.createPDFMG_NewHire(employee, requirements);

emp = employee;

process = new System.Diagnostics.Process();
string path = System.IO.Path.GetTempPath() + "\\ITResources\\Manager\\NewHire_" + employee.m_name.Replace(" ", "") + ".pdf";
Uri pdf = new Uri(path, UriKind.RelativeOrAbsolute);
process.StartInfo.FileName = pdf.LocalPath;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(process_Exited);
process.Start();
pid = process.Id;
}

catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error Message", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

这是事件处理方法:

private void process_Exited(object sender, EventArgs e)
{
try
{
if (process.Id == pid)
{
if (process.HasExited)
{
PDFUtility pdfu = new PDFUtility();
pdfu.getReaders_NewHire(emp);

Emailer send = new Emailer();
send.SendAfterMG_NewHire();
}
else
MessageBox.Show("Process has not exited.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error Message", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

事件处理程序中的 getReaders 方法需要读取客户端必须签名的文件,因此必须事先关闭它。我无法强制关闭,因为我永远不知道他们需要多长时间才能签名,而且在他们签名并保存 pdf 之前我无法发送电子邮件。

我已经尝试使用 WaitForExit() 方法并且它完全跳过(仅在我客户的计算机上)。我运行的是 Windows 10,但客户端运行的是 Windows 7。我无法找到有关这些方法不适用于 Win7 的任何文档。

注意:我知道事件处理程序方法中的 if 语句有点多余,但我很想知道它在哪里被捕获。

如有任何帮助,我们将不胜感激。

已修复:在我的 PDF 被签名以协助后台工作线程中的 WaitForExit() 后,我最终弹出了一个消息框。按下此消息框的“确定”按钮后(因为它们会暂停应用程序并等待响应),然后它会读取 pdf 文件。

最佳答案

It uses Adobe Acrobat Reader DC.

我认为这是您的优势,我的方法也假设了这一点。请考虑以下事项:

private static void Main()
{
var process = Process.GetProcessesByName("AcroRd32").FirstOrDefault();
if (process != null)
{
Process.Start(@"C:\mvvm.pdf");
}
else
{
process = Process.Start(@"C:\mvvm.pdf");
}
process.EnableRaisingEvents = true;
process.Exited += (sender, args) =>
{
Console.WriteLine("Exited");
};

Console.ReadLine();
}

首先,我们检查 Adob​​e 进程是否已在运行,如果是,我们保留引用并将事件处理程序挂接到该现有进程。如果不是,我们会做您已经做过的事情。省略了一些验证码。

我已经在进程运行和未运行的情况下进行了测试,并且都有效。

注意:如果用户将另一个应用程序配置为预定义的 PDF 阅读器,它将无法按预期工作

关于c# - System.Diagnostics.Process.HasExited 始终返回 true 并且 Process.Exited 事件处理程序始终在进程仍处于打开状态时命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50972582/

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