C#学习教程:即使将EnableRaisingEvents设置为true,也永远不会调用Process.Exited作为预期输出存在。但是当我使用下面的方法运行它时,Process.Exited事件永远不会被触发。请注意,我记得Process.EnableRaisingEventsprotectedoverrideResultExecute(RunExecutabletask){varprocess=newProcess();process.StartInfo.Arguments=task.Arguments;process.StartInfo.FileName=task.ExecutablePath;process.StartInfo.CreateNoWindow=true;process.StartInfo.UseShellExecute=false;process.StartInfo.RedirectStandardOutput=true;process.EnableRaisingEvents=true;process.Exited+=(sender,args)=>{processSync.OnNext(newResult{Success=process.ExitCode==0,Message=process.StandardOutput.ReadToEnd()});processSync.OnCompleted();};过程。开始();返回processSync.First();;如果我使用Process.WaitForExit()而不是响应式扩展,问题是一样的,等待退出事件。此外,如果我使用另一个生成另一个输出的参数运行该过程,它就可以工作。好像跟process.StartInfo.RedirectStandardOutput=true有关;因为当我禁用它时,它会起作用。但这可能只是另一个问题的症状。任何帮助表示赞赏:-)您的代码陷入僵局。“标准输出”只是一个命名管道,带有一个小缓冲区,用于将数据从一个进程传输到另一个进程。如果缓冲区已满,写入进程必须等待读取进程从缓冲区中检索一些数据。因此,您启动的进程可能正在等待您从stdout读取,但您正在等待进程完成才能开始读取->死锁。解决方案是在进程运行时连续读取——只需在调用WaitForExit()之前调用StandardOutput.ReadToEnd()。如果您想在不阻塞当前线程的情况下读取,可以使用BeginOutputReadLine()和OutputDataReceived事件。显然,如果你重定向它,你必须监听StandardOutput流,否则Process不会退出。它等待有人先读取输出。以上是不调用Process.Exited事件的C#学习教程:即使EnableRaisingEvents设置为true,也永远不会调用Process.Exited共享的全部内容。注意——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
