0

需要发烧,我创建了一个可以打开多个 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;
        }
    }
4

2 回答 2

1

当 Word 的现有实例打开时,它会重用该实例。一个短暂的过程是启动,它只告诉现有实例打开另一个文档。因此,您不能可靠地等待 Word 退出。

也许您对 Office COM 对象模型有更多的运气。

或者,您可以使用Process.GetProcessesByName来获取所有现有的 Word 实例。

于 2013-10-11T11:35:18.220 回答
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();
}
于 2013-10-11T10:33:11.997 回答