我正在编写程序中的一个功能,用户可以编辑存储在数据库中的文档,它将文档保存到临时文件夹,然后使用Process.Start将文档启动到编辑应用程序中,例如Microsoft Word。
然后我的应用程序需要等到他们关闭被调用的进程并用temp文件夹中新编辑的副本替换数据库中的文档。
只要被调用的应用程序尚未运行,以下代码就可以正常运行:
ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName=TempFolder + Path.DirectorySeparatorChar + f.Name;
Process p = new Process();
p.StartInfo = pInfo;
p.Start();
//p is null at this point if called application was already running
//i.e. Microsoft Word is re-used instead of starting a fresh copy
p.WaitForInputIdle();
p.WaitForExit();
有没有办法强制启动一个全新的流程,或者任何人都可以想到另一种方法来处理这个问题。我真的不希望用户能够在我的应用程序中执行任何其他操作,直到他们关闭被调用的进程,因为我需要知道他们是否在那个时间点编辑了该文件,而不是之后各种各样的其他问题可能会蔓延。
答案 0 :(得分:2)
就我个人而言,我不确定我是否同意这种做法。显示模态表单可能会让您摆脱这种情况,但在大多数情况下,当解决方案很难找到时,更改您尝试解决的问题会很有帮助。
选项1:
在这种情况下,我建议使用结帐/签到模式。这将允许用户将文件“签出”到他们的机器,然后在完成更新后检查它。这有很多好处:
该模型也非常适合创建新文档并将其添加到数据库的概念。它和签到一样。
您可以轻松提供报告,显示签出了哪些文件的人,以及他们的“工作副本”位置。
我会承认,通常只有开发人员对此模型感到满意,并且您可能需要投入少量的重新培训。我认为设置一个自动提醒系统并不困难,该系统会在人们长时间检出文件时向他们发送电子邮件。
选项2:
使用FileSystemWatcher或同等文件观察文件。这将使您能够密切关注文件,并且当用户执行保存操作时,您可以提交到数据库。毕竟,只有当用户实际保存了您有兴趣更新数据库的文件时
答案 1 :(得分:0)
我不确定是否启动了新进程,但您是否考虑过这种逻辑等待退出:
while(Process.IsRunning){}
基本上只是一个持有者循环,直到你的过程完成。
答案 2 :(得分:0)
是,订阅流程'已退出事件并将process.EnableRisingEvents属性设置为true。然后让你的应用程序什么都不做,直到Exited事件被触发为止!
关于强制使用新进程,我认为这是默认行为,我认为这取决于你正在调用的进程,如果它允许同时运行多个实例,这是不是你的控制...不幸的是
祝你好运!
答案 3 :(得分:0)
我认为你正在使用错误的方法来解决问题。如果您只处理word文档,我相信您应该使用COM interop从您的应用程序中识别和控制单词。使用COM,您可以用文字控制所有内容,您将能够用文字打开文档,并且您将知道用户何时关闭文档。
答案 4 :(得分:0)
经过进一步研究并发现一些帖子提到WaitForExit的不可靠性和流程'退出事件',我提出了一个完全不同的解决方案:我开始这个过程并且不打扰等待它,只是弹出一个模态对话框,用户可以在其中点击更新,以便在编辑和保存临时文件或取消时将临时文件夹文件更新回数据库。
这种方式掌握在他们手中,我不必依赖于Process.Start的变幻莫测。
感谢大家的帮助。