打开多个 Word 文档时触发进程退出事件

问题描述 投票:0回答:3

需要一些帮助。我创建了一个可以打开多个 Word 文档的桌面应用程序。 但在这里我面临一个问题,当第二个文档打开时,第一个文档的退出事件会触发,而不会关闭该文档。

以下是我的代码:

private void CreateNewProcessForEachDocument()
{
    try
    {
        docProcess = new Process();

        docProcess.StartInfo = new ProcessStartInfo(
            string.Concat(folderPath, fileName));
        docProcess.EnableRaisingEvents = true;
        docProcess.Exited += new EventHandler(docProcess_Exited);
        docProcess.Start();
        docProcess.WaitForExit();

        docProcess.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }
} 

private void docProcess_Exited(object sender, EventArgs e)
{
    try
    {
        var client = new ValidateClientClient();
        byte[] fileData = File.ReadAllBytes(string.Concat(folderPath, fileName));
        bool fileSaved = client.SaveDocument(fileData, fileName, username);
        string filePath = Path.GetFullPath(string.Concat(folderPath, fileName));
        if (fileSaved && File.Exists(filePath))
        {
            File.Delete(filePath);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
c# .net multithreading process
3个回答
1
投票

当打开现有的 Word 实例时,它会重用该实例。一个短暂的进程是启动,它除了告诉现有实例打开另一个文档之外什么也不做。因此,您无法可靠地等待 Word 退出。

也许您使用 Office COM 对象模型会更幸运。

或者,您可以使用

Process.GetProcessesByName
获取所有现有的 Word 实例。


0
投票

您忘记将退出事件与侦听器方法绑定。 将其添加到您的代码中:

docProcess.Exited += new EventHandler(docProcess_Exited);

更新: 如果您只是在button_click上调用CreateNewProcessForEachDocument(),那么您的应用程序就像一个简单的单线程应用程序一样工作,就像您启动新线程一样,您会等到它完成然后继续。 看起来你需要这个:

private void CreateNewProcessForEachDocument()
{
  var docProcess = new Process {StartInfo = new ProcessStartInfo("cmd.exe"), EnableRaisingEvents = true};
  docProcess.Exited += docProcess_Exited;
  docProcess.Start();
}

0
投票

考虑到提出这个问题已经过去很多年了, 我正在为可能遇到同样问题的其他人提供此信息。 当您打开 Word 文档并再次运行该进程时,它会创建一个具有新 ID 的新进程。此实例立即转移到已打开的 Word 文档,导致触发“Exited”事件,即使 Word 文档实际上并未关闭。 但是,当您通过单击原始文件打开 Word 文档时,不会出现此问题。 为了防止出现此问题,您需要强制它使用新实例打开。 这是示例代码:

    private async void StartWord()
    {
        try
        {

            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "WINWORD",
                    Arguments = $"/x {_FilePath}"  ,
                    UseShellExecute = true
                },
   
            };

            process.Exited += new EventHandler(docProcess_Exited);
            process.Start();
            await process.WaitForExitAsync();

        }
        catch (Exception ex)
        {
            NotifyUser("Error starting process: " + ex.Message);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.