代码之家  ›  专栏  ›  技术社区  ›  Anu Viswan

在任务中包装EAP

  •  2
  • Anu Viswan  · 技术社区  · 6 年前

    我试图用以下代码在任务中包装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;
        }
    

    但是,退出的事件永远不会被激发。有人能告诉我这里出了什么问题吗?

    请注意,上面的代码是一个原型,“事件不触发”场景也发生在真实场景中。

    2 回复  |  直到 6 年前
        1
  •  1
  •   TheGeneral    6 年前

    不解决任何其他问题。

    Process.EnableRaisingEvents Property

    获取或设置当 进程终止。

    评论

    EnableRaisingEvents属性指示组件 应在操作系统关闭进程时通知。 EnableRaisingEvents属性在异步处理中用于 通知应用程序进程已退出。强迫你 应用程序同步等待退出事件(中断 处理应用程序直到发生退出事件),使用 waitforexit方法

    例子

    var p = Process.Start(startInfo);
    p.EnableRaisingEvents = true;
    p.Exited += new EventHandler(ProcessExited);
    
        2
  •  2
  •   Dharani Kumar    6 年前

    您需要启用进程的事件引发属性

    这样地

    var process = new Process
    
    {
        EnableRaisingEvents = true,
        StartInfo = new ProcessStartInfo(processPath)
        {
            RedirectStandardError = true,
            UseShellExecute = false
        }
    };