需要一些发烧,我创建了一个打开多个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;
}
}
答案 0 :(得分:1)
当Word的现有实例打开时,它会重用该实例。一个短暂的进程是启动,除了告诉现有实例打开另一个文档之外什么都不做。因此,您无法可靠地等待Word退出。
也许你对Office COM对象模型有更多好运。
或者,您可以使用Process.GetProcessesByName
获取所有现有的Word实例。
答案 1 :(得分:0)
您忘记使用侦听器方法绑定exit事件。 将其添加到您的代码中:
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();
}