C# Process.Start,如何防止重复使用现有应用程序?

标签 c# winforms

我在一个程序中编写一个功能,用户可以在其中编辑存储在数据库中的文档,它将文档保存到一个临时文件夹,然后使用 Process.Start 将文档启动到编辑应用程序中,例如 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();

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

最佳答案

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

选项 1:

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

  • 他们可以同时编辑多个文档,并同时对多个文档执行 checkin 操作。
  • 他们可以将评论应用于签到。
  • 用户可以关闭他们的 PC,或离线并继续处理他们的文档。
  • 用户可以在本地 checkout 多个文档,然后将工作带回家。
  • 您不必尝试弄清楚如果在文档打开时 PC 崩溃(或笔记本电脑电池没电)该怎么办,以及如何将所有内容重新组合起来。

该模型也非常符合创建新文档并将其添加到数据库的概念。这与签到相同。

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

我承认通常只有开发人员对这种模型感到满意,并且您可能需要投资少量的重新培训。我不认为设置一个自动提醒系统会很困难,该系统会在人们长时间 checkout 文档时向他们发送电子邮件。

选项 2:

使用 FileSystemWatcher 或等价物观察文件。这将使您能够密切关注文件,并且当用户执行保存操作时,您可以提交到数据库。毕竟,只有当用户实际保存了您有兴趣更新数据库的文件时,

关于C# Process.Start,如何防止重复使用现有应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/303339/

相关文章:

C# - 更新 ListView 中的子项

c# - 是什么导致 Winforms 默默地丢弃未处理的异常(没有 try/Catches)?

c# - DispatcherTimer.Start() 在后台线程中启动 Tick?

c# - 如何配置 mod_mono 以运行 .NET 4.5

C# Blazor WebAssembly : Argument 2: cannot convert from 'void' to 'Microsoft.AspNetCore.Components.EventCallback'

.net - 用户控件数据绑定(bind)的最佳实践 - 如何实现?

winforms - WinForm 使用带有 SSO 的 webview2

c# - linq c# 中的动态多个 where 子句

c# - 正则表达式 ~ 将 UNC 转换为 URL

asp.net - WinForms和ASP.NET自定义控件的通用代码