C# 如何等待将启动的进程?

C# 如何等待将启动的进程?,c#,synchronization,wait,C#,Synchronization,Wait,我的应用程序需要等待特定进程启动。我是这样做的 while (Process.GetProcessesByName("someProcess").Length == 0) { Thread.Sleep(100); } 有没有其他方法(更优雅)来实现这一点,其功能类似于WaitForExit()?谢谢你的回答。看看这门课 具体而言,链接底部的代码示例向您展示了如何设置ManagementEventWatcher,以便在创建新流程时收到通知 从MSDN代码示例复制的代码(可以经受一点清理)

我的应用程序需要等待特定进程启动。我是这样做的

while (Process.GetProcessesByName("someProcess").Length == 0)
{
    Thread.Sleep(100);
}
有没有其他方法(更优雅)来实现这一点,其功能类似于WaitForExit()?谢谢你的回答。

看看这门课

具体而言,链接底部的代码示例向您展示了如何设置ManagementEventWatcher,以便在创建新流程时收到通知

从MSDN代码示例复制的代码(可以经受一点清理):

编辑

添加了
TargetInstance.Name='someProcess'
过滤器的简化示例

  var query = new WqlEventQuery(
                "__InstanceCreationEvent", 
                new TimeSpan(0, 0, 1), 
                "TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'someProcess'"
              );

  using(var watcher = new ManagementEventWatcher(query))
  {
    ManagementBaseObject e = watcher.WaitForNextEvent();

    //someProcess created.

    watcher.Stop();
  }

据我所知,
进程
类中没有任何东西可以让它变得简单

如果您无法控制子流程中的源代码,那么您可能应该使用Calgary Coder提供的WMI解决方案

如果您确实可以控制子流程中的代码,那么还有一些其他方法可以解决此问题。我用过(用过),和

这些解决方案的优点是子流程必须选择它。子进程可以自由等待,直到完成其启动初始化例程,然后再让父应用程序知道它已“准备就绪”


这些链接中的每一个都有一些示例,可以帮助您开始解决这个问题。如果您对某个特定的解决方案感兴趣,并且有问题,请告诉我,我将发布该特定解决方案的一些示例代码。

WaitForInputIdle()将告诉您消息泵应用程序何时处于空闲状态。这可以用来查看进程何时完成加载,但我猜您甚至不知道它是否已开始加载。可能重复感谢您的回答,以及使用ManagementEventWatcher或像我的代码中那样主动等待哪个方法更好(对cpu更方便)?thanks@sanjuro-WMI是推荐的方法;在C#中轮询进程列表是一项昂贵的操作。我没有可供审查的明确统计数据;但如果您真的担心,您可以在本地运行一些比较(也就是说,如果这被认为是性能瓶颈,我只会担心)。
  var query = new WqlEventQuery(
                "__InstanceCreationEvent", 
                new TimeSpan(0, 0, 1), 
                "TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'someProcess'"
              );

  using(var watcher = new ManagementEventWatcher(query))
  {
    ManagementBaseObject e = watcher.WaitForNextEvent();

    //someProcess created.

    watcher.Stop();
  }