代码之家  ›  专栏  ›  技术社区  ›  avi12

在流程关闭时执行操作

  •  -2
  • avi12  · 技术社区  · 11 年前

    首先,我在Windows窗体应用程序中编程。
    正如标题所描述的,我想在我启动的流程将关闭时执行一个操作。

    我一开始尝试过:

    Process s = new Process();  
    s.EnableRaisingEvents = true;  
    s = Process.Start(processToStart);  
    s.Exited += s_Exited;
    

    当我这样做时:

    Process s = new Process();  
    s = Process.Start(processToStart);  
    s.EnableRaisingEvents = true;  
    s.Exited += s_Exited;
    

    我有例外 System.InvalidOperationException .

    完整异常详细信息:

    附加信息:跨线程操作无效:控件“Main”是从创建它的线程以外的线程访问的。

    1 回复  |  直到 11 年前
        1
  •  1
  •   L.B    11 年前

    原始代码有两个问题

    1- 将新流程分配给 s s = Process.Start(processToStart); ,所以你放松了 s.EnableRaisingEvents = true;

    2- 已退出 事件是从不同于UI线程的线程调用的。因此,您应该使用 援引 避免 跨线程异常

    Process p = new Process();
    p.EnableRaisingEvents = true;
    p.StartInfo = new ProcessStartInfo() { FileName = processToStart };
    p.Exited += (s, e) =>
    {
        this.Invoke((Action)(() =>
        {
            //your code accesing UI, for ex, 
            this.Text = "Exited";
        }));
    };
    p.Start();
    

    PS(秒): 当前代码附加到 已退出 进程启动后的事件。它可能会发生(概率很低),在您附加到事件之前,进程退出。以上代码是更正确的方法。