C#Process.Start-如何强制WaitForExit

C#Process.Start-如何强制WaitForExit,c#,process,clickonce,waitforexit,C#,Process,Clickonce,Waitforexit,我有一个控制台应用程序,可以调用其他控制台应用程序 我正在使用以下链接了解如何: 当我收到错误消息“指定的可执行文件不是此操作系统平台的有效应用程序”时,我无法实例化进程并使用它 我可以使用进程的静态版本调用应用程序,例如 Process.Start(shortcutPath, arguments); 或 但是,我无法让进程WaitForExit—调用一个应用程序,过一段时间,在第一个应用程序完成之前,调用第二个应用程序—这是一个问题,因为它取决于第一个应用程序是否完成 关于如何让流程的静态版

我有一个控制台应用程序,可以调用其他控制台应用程序

我正在使用以下链接了解如何:

当我收到错误消息“指定的可执行文件不是此操作系统平台的有效应用程序”时,我无法实例化进程并使用它

我可以使用进程的静态版本调用应用程序,例如

Process.Start(shortcutPath, arguments);

但是,我无法让进程WaitForExit—调用一个应用程序,过一段时间,在第一个应用程序完成之前,调用第二个应用程序—这是一个问题,因为它取决于第一个应用程序是否完成

关于如何让流程的静态版本等待退出的任何建议(可选。如何实例化流程并能够调用clickonce部署的应用程序?

Process.Start方法(字符串, 字符串)的返回值为System.Diagnostics.Process

根据is:

与流程资源关联的新流程,如果未启动流程资源,则为null。请注意,与同一流程的已运行实例一起启动的新流程将独立于其他流程。此外,Start可能返回一个非null进程,其HasExited属性已设置为true。在这种情况下,已启动的进程可能已激活其自身的现有实例,然后退出

因此,在调用WaitForExit之前,我会检查process.haseExit是否为true

var process = Process.Start(shortcutPath, arguments);
if (process != null && process.HasExited != true)
{
    process.WaitForExit();
}
else
{
    // Process is null or have exited
}

好吧,在一天中的大部分时间里我的头撞在墙上之后,我发现了这个

使用互斥体选项。Fek me Microsoft,你把以前非常简单的东西都拿出来了,真是让人大吃一惊


我正要废弃我的exe,创建一个怪物——我对此感到不舒服。

你可以在已经退出的进程上调用WaitForExit。如果您不能,这段代码将引入一个race condition.foobar-尝试了这个。这没什么区别——处理过程只会一直进行到下一次通话。如果我一步一步地浏览代码并尝试查看流程变量的值,我会得到“BasePriority='process.BasePriority'引发了一个类型为'System.invalidoOperationException'的异常”。尽管代码位于try/catch块中,但这不会引发异常…注意:即使调查进程变量也会引发错误,调用的exe正在毫无问题地运行。@DaveTapson-当您试图检查尚未设置的属性时,Visual Studio可能会显示异常。例如,当我启动进程并且它正在运行时,我看到ExitCode='process.ExitCode'在这种情况下引发了一个类型为'System.InvalidOperationException'的异常,因为进程仍在运行。如果调用的exe已经在运行,应该设置它吗?我还试着加入一个Thread.Sleep(5000)让它有时间赶上进度,但没有任何差异。您的变量名为
shortcutPath
。您是在启动快捷方式(
.lnk
文件)还是可执行文件(
.exe
文件)?当您部署clickonce应用程序时,您会得到一个指向MS部署实际exe位置的引用。我打电话给警察局。它看起来像:C:\Users\User Name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\xxx\xxx\xxx.appref-msI可以搜索这些exe并执行正常的过程。Start,但是每次我重新部署调用的应用程序时,我都必须更新调用应用程序中的文件路径并重新部署它。
var process = Process.Start(shortcutPath, arguments);
if (process != null && process.HasExited != true)
{
    process.WaitForExit();
}
else
{
    // Process is null or have exited
}