我怎么能得到Process.waitForFinish()

本文关键字:waitForFinish Process 怎么能 | 更新日期: 2023-09-27 18:03:54

我试图在进程结束工作但尚未杀死时获得进程的pid。

process.WaitForExit();

上面的方法停止,直到进程被杀死,但我正在寻找类似process.waitForFinish的东西,因为我试图在进程完成工作但尚未被杀死时处理它。

就像添加一个信号并进入另一个过程。例:

//Process to catch
main(){
    //Do some Code
    End of the function
    SendEndSignal(); & Stop();
}

第二个进程将像这样捕获第一个进程

main(){
    int pid = Process.start("Process1.exe");
    process.waitUntilReceiveSignal();
    //Do code here
    process.kill();
}

我需要像process.WaitForInputIdle();这样的东西,但这里的问题是它只有在过程包含图形界面时才能工作。那么,如果进程通过控制台等待用户输入,如使用Console.readLine(),该怎么办呢?

这意味着我需要知道进程何时进入非活动状态,而不是被杀死。

我怎么能得到Process.waitForFinish()

EventWaitHandle是您的一种选择。

namespace A
{
   class Program
    {
       static void Main(string[] args)
        {
           var evh = new EventWaitHandle(false, EventResetMode.AutoReset,"fromA");
           Console.WriteLine("Anykey to send signal");
           Console.ReadKey();
            evh.Set();
        }
    }
}
namespace B
{
   class Program
    {
       static void Main(string[] args)
        {
           Console.WriteLine("Waiting for a signal");
           var evh = EventWaitHandle.OpenExisting("fromA");
            evh.WaitOne();
           Console.WriteLine("Signal!");
           Console.ReadKey();
        }
    }
}

但是请记住,您需要等待子进程注册它的EventWaitHandle。所以你要么等一段时间(丑)。或者在父进程中创建另一个EventWaitHandle,以便子进程在其处理程序注册时通知

编辑:完整解决方案

namespace Parent
{
   class Program
    {
       static void Main(string[] args)
        {
           using (var childReadyEh =new EventWaitHandle(false, EventResetMode.AutoReset,"childIsReady"))
            {
               Process.Start("child.exe");
                childReadyEh.WaitOne();
            }
           using (var childSignalEh =EventWaitHandle.OpenExisting("childSignal"))
            {
                childSignalEh.WaitOne();
            }
           Console.WriteLine("Signal is recieved");
           Console.ReadKey();
        }
    }
}
namespace Child
{
   class Program
    {
       static void Main(string[] args)
        {
           EventWaitHandle childSignalEh =null;
           using (var childReadyEh =EventWaitHandle.OpenExisting("childIsReady"))
            {
                childSignalEh =new EventWaitHandle(false, EventResetMode.AutoReset,"childSignal");
                childReadyEh.Set();
            }
           Console.WriteLine("Anykey to send a signal to parent");
            Console.ReadKey();
            childSignalEh.Set();
            childSignalEh.Dispose();
           Console.WriteLine("Signal is sent");
           Console.ReadKey();
        }
    }
}