C#进程。启动时,如何防止重复使用现有应用程序?

C#进程。启动时,如何防止重复使用现有应用程序?,c#,winforms,C#,Winforms,我在一个程序中编写了一个功能,用户可以编辑存储在数据库中的文档,它将文档保存到一个临时文件夹中,然后使用Process。开始将文档启动到编辑应用程序中,例如Microsoft Word 然后,我的应用程序需要等待,直到他们关闭了调用的进程,并用临时文件夹中新编辑的副本替换数据库中的文档 只要被调用的应用程序尚未运行,以下代码就可以正常工作: ProcessStartInfo pInfo = new ProcessStartInfo(); pInfo.FileName=TempFolder + P

我在一个程序中编写了一个功能,用户可以编辑存储在数据库中的文档,它将文档保存到一个临时文件夹中,然后使用Process。开始将文档启动到编辑应用程序中,例如Microsoft Word

然后,我的应用程序需要等待,直到他们关闭了调用的进程,并用临时文件夹中新编辑的副本替换数据库中的文档

只要被调用的应用程序尚未运行,以下代码就可以正常工作:

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();

有没有一种方法可以强制启动一个全新的流程,或者任何人都可以想出另一种方法来处理这个问题。我真的不希望用户在关闭调用的进程之前能够在我的应用程序中执行任何其他操作,因为我需要知道他们是否在该时间点编辑了该文件,而不是在以后出现各种其他问题时。

我不确定是否要启动新进程,但您是否考虑过等待退出的逻辑:

while(Process.IsRunning){}


基本上只是一个holder循环,直到流程完成。

是的,订阅流程的Exited事件并将process.EnableRisingEvents属性设置为true。然后让你的应用程序什么都不做,直到退出的事件被触发

关于强制使用新流程,我认为这是默认行为,我认为这取决于您正在调用的流程是否允许多个实例同时运行,这是您无法控制的…很遗憾


祝你好运

我认为你在解决问题时使用了错误的方法。如果您只处理word文档,我相信您应该使用COM互操作从应用程序中控制word。有了COM,你可以用word控制一切,你可以用word打开文档,你就知道用户什么时候关闭了它。

经过进一步的研究,并看到一些帖子提到WaitForExit的不可靠性和进程的退出事件,我想出了一个完全不同的解决方案:我启动这个过程,不必等待,只需弹出一个模式对话框,用户可以在编辑并保存临时文件后单击“更新”将临时文件夹文件更新回数据库,或者取消

这样,它就掌握在他们手中,我不必依赖于过程的变幻莫测


谢谢大家的帮助。

就我个人而言,我不确定我是否同意这种方法。显示模式表单可能会使您摆脱这种情况,但在大多数情况下,当解决方案似乎很难找到时,更改您试图解决的问题会很有帮助

选项1:

在这种情况下,我建议使用签出/签入模型。这将允许用户将文件“签出”到他们的机器上,然后在完成更新后将其签入。这有很多好处:

  • 它们可以一次编辑多个文档,并一次对多个文档执行签入操作
  • 他们可以将注释应用于签入
  • 用户可以关闭电脑,也可以脱机处理文档
  • 用户可以在本地签出多个文档,然后将工作带回家
  • 当文档打开时,如果电脑崩溃(或笔记本电脑电池耗尽),你不必去想该怎么办,也不必想办法让它恢复正常
该模型也非常符合创建新文档并将其添加到数据库的概念。这和登机手续一样

您可以轻松地提供报告,显示谁签出了什么文档,以及他们的“工作副本”位置

我承认,通常只有开发人员对该模型感到满意,并且您可能需要投资少量的再培训。我认为建立一个自动提醒系统并不困难,它可以在人们签出文档很长时间后向他们发送电子邮件

选项2:


使用FileSystemWatcher或等效工具查看文件。这将使您能够监视文件,并且当用户执行保存操作时,您可以提交到数据库。毕竟,只有当用户确实保存了您对更新数据库感兴趣的文件时,

如果重新使用现有应用程序,则在调用start后,Process立即为null。不幸的是,有两个问题:如果Process重新使用,则在调用start后,Process立即为null;如果他们已经为另一个文档打开了该应用程序,在他们把它也关上之前,我都被冻住了。嗯……你试过去掉最后两行吗:p.WaitForInputIdle();p、 WaitForExit()?然后使用订阅退出并将EnableRisingEvents设置为true,然后调用start()编辑的标记进行更一般化,以便在更多提要上看到这个问题。不,这不仅仅是word文档,这只是一个示例,它可以是任何类型的文件。选项一是一个很好的主意,对遇到此问题的其他人很有用;如果文档管理是应用程序的中心点。我愿意这样做,但这是一个附带功能,模态对话框既简单又防弹,这是我喜欢的软件中必须支持的两件事。:)选项二我会非常小心使用,我考虑过它,但在网上遇到了很多关于它的问题的帖子,甚至它自己的文档也提到了缓冲区长度和长文件名等许多潜在问题。我认为对我来说太脆弱了,但可能对其他人有用。