我试图用以下代码将EAP包装在一个任务中。
public static async Task<string> Caller()
{
var ret = await RunProgram();
return ret;
}
public static async Task<string> RunProgram()
{
TaskCompletionSource<string> source = new TaskCompletionSource<string>();
var process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = "cmd";
process.Exited += (sender, args) =>
{
source.SetResult("hello");
};
process.Start();
return await source.Task;
}
然而,退出事件永远不会被解雇。有人可以指导我在这里做错了吗?
请注意,上面的代码是一个原型,&#39;事件 - 不解雇&#39;场景也发生在真实场景中。
答案 0 :(得分:2)
您需要启用Process
的事件提升属性 像这样var process = new Process
{
EnableRaisingEvents = true,
StartInfo = new ProcessStartInfo(processPath)
{
RedirectStandardError = true,
UseShellExecute = false
}
};
答案 1 :(得分:1)
不解决任何其他问题。
Process.EnableRaisingEvents Property
获取或设置是否应该在引发时引发Exited事件 流程终止。
<强>说明强>
EnableRaisingEvents属性指示组件是否存在 应在操作系统关闭进程时收到通知。 EnableRaisingEvents属性用于异步处理 通知您的应用程序已退出进程。强迫你的 应用程序同步等待退出事件(中断 处理应用程序直到退出事件发生),使用 WaitForExit方法
示例强>
var p = Process.Start(startInfo);
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(ProcessExited);