C# System.Diagnostics.Process.HasExited始终返回true和Process。退出的事件处理程序始终在流程仍然打开时命中
我目前的一段代码有问题。当我在Visual Studio 2013中运行该代码时,以及当我使用ClickOnce发布时,该代码在我的机器上运行得非常好(即使没有一些额外的if语句)。在客户端计算机上,退出进程的事件处理程序将捕获该进程,该进程ID正确,并且process.hasExited在该进程仍处于打开状态时返回true。该过程将打开pdf供他们签名,并等待他们保存并关闭它,然后再继续。它使用AdobeAcrobatReaderDC 收到的错误消息来自事件处理程序方法的catch块: System.IO.IOException:进程无法访问该文件,因为另一个进程正在使用该文件 这发生在调用getReaders_NewHire(emp)时 这是打开流程的方法:C# System.Diagnostics.Process.HasExited始终返回true和Process。退出的事件处理程序始终在流程仍然打开时命中,c#,.net,wpf,visual-studio-2013,C#,.net,Wpf,Visual Studio 2013,我目前的一段代码有问题。当我在Visual Studio 2013中运行该代码时,以及当我使用ClickOnce发布时,该代码在我的机器上运行得非常好(即使没有一些额外的if语句)。在客户端计算机上,退出进程的事件处理程序将捕获该进程,该进程ID正确,并且process.hasExited在该进程仍处于打开状态时返回true。该过程将打开pdf供他们签名,并等待他们保存并关闭它,然后再继续。它使用AdobeAcrobatReaderDC 收到的错误消息来自事件处理程序方法的catch块: Sys
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()之后,我最终弹出了一个消息框。按下此消息框的OK按钮(因为它们暂停应用程序并等待响应)后,它将读取pdf文件
它使用AdobeAcrobatReaderDC
我认为这是你的优势,我的方法假设了这一点。考虑以下事项:
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();
}
首先,我们检查Adobe进程是否已经运行,如果已经运行,我们将保留引用并将事件处理程序挂接到该现有进程。如果没有,我们就做你已经做过的事。省略了一些验证代码
我已经测试了该进程是否运行,它是否正常工作
注意:如果用户将另一个应用程序配置为预定义的PDF阅读器,它将无法按预期工作。这与此有什么关系?@SirRufo很抱歉,这是一个WPF应用程序。您的进程似乎只是试图打开该文件。您是否应该等待从pdfu.createPDFMG_NewHire调用创建整个文件?如果pdfu.createPDFMG_NewHire调用正在创建PDF,它可能没有正确关闭文件句柄,因此当您启动文件以从技术上打开它时,它仍然在创建过程中被锁定。@Matt创建PDF时,文档将正确关闭并保存在指定位置。打开pdf的过程也很有效。但在关闭pdf之前,它会命中已退出的事件处理程序。getReaders_NewHire调用打开pdf备份以将其与另一个文件合并;在您的process.Start()调用之后?