【问题标题】:How to always run new instance of a process in C#?如何始终在 C# 中运行进程的新实例?
【发布时间】:2015-10-08 09:59:26
【问题描述】:

基于此https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx Process.Start() 没用。

Start 可能会返回一个带有其 HasExited 属性的非空进程 已经设置为真。在这种情况下,启动的进程可能有 激活其自身的现有实例,然后退出。

在我的例子中,我想在新实例中为 xml 启动一个默认编辑器,以便我可以使用 Process.HasExited 属性对我的 WPF 应用程序执行操作。我所看到的只是本地样本或比想象的复杂得多。什么是最好的解决方案?

Process process = Process.Start(MyFileXMlPath);
//Wait for the Editor to be closed.
if (process != null) 
    while (!process.HasExited) ;

这就是我现在所拥有的。这样我就可以使用用户的首选编辑器了。

【问题讨论】:

  • 你能解释一下现在发生了什么吗?它是否有效?您是否只是担心警告,或者您有时会通过 HasExited 属性获得一个进程到 true
  • 它总是在一个正在运行的进程窗口中打开 XML。进程句柄也为空,我的应用程序不会等待用户完成并关闭窗口以对新的 xml 文件执行操作。所以如果我让 Process.Start(MyFileXMLPath) 总是启动一个新实例,所有问题都解决了。

标签: c# process


【解决方案1】:

发生的情况是预期行为 - 要​​求编辑器打开一个文件,并且它正在现有正在运行的进程中打开该文件。一种解决方案可能是使用Process.GetProcesses 来获取盒子上所有正在运行的进程并遍历它们以找到新进程,但这可能是有问题的,因为确实没有好的方法来判断哪个进程打开了文件。

您可能想要做的是将 UseShellExecute 设置为 false,显式运行您想要的编辑器(例如 @"c:\Windows\notepad.exe")并将文件名作为参数传递,这通常是约定打开文件。显然,您希望选择一个不调用现有实例的编辑器。

【讨论】:

  • 似乎我的要求非常严格(至少到目前为止)使用用户的首选编辑器。因此,我将使用 Interops 和 Native API 来查找默认编辑器并使用 ProcessInfo 单独启动该程序。将使用解决方案更新此线程。似乎这是唯一的方法...?
  • 这可能无济于事。编辑器本身决定使用现有进程,而不是 shell。
  • 关闭:我通过读取 AssocProgram 的文件扩展名并使用我的文件路径启动该程序来修复它。这总是会启动新实例。
猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 2020-01-25
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
相关资源
最近更新 更多