我怎么能得到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()
,该怎么办呢?
这意味着我需要知道进程何时进入非活动状态,而不是被杀死。
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();
}
}
}