Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Diagnostics.Process.HasExited始终返回true和Process。退出的事件处理程序始终在流程仍然打开时命中_C#_.net_Wpf_Visual Studio 2013 - Fatal编程技术网

C# System.Diagnostics.Process.HasExited始终返回true和Process。退出的事件处理程序始终在流程仍然打开时命中

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

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

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

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()之后,我最终弹出了一个消息框。按下此消息框的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()调用之后?