在任务中包装EAP

时间:2018-05-24 06:09:03

标签: c# async-await task

我试图用以下代码将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;场景也发生在真实场景中。

2 个答案:

答案 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);