首先,我正在使用Windows Forms Application进行编程 正如标题所描述的那样,我想在我开始的过程中执行一个动作,然后关闭。
我最初尝试过:
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”。
答案 0 :(得分:1)
原始代码存在两个问题
1 - 您在{em> s
为s = Process.Start(processToStart);
分配了一个新流程,因此您将失去 s.EnableRaisingEvents = true;
2 - 从与您的UI线程不同的线程调用已退出的事件。因此,您应该使用 Invoke 来避免跨线程异常
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: 您的当前代码会在进程启动后附加到已退出事件。它可能发生(概率很低),该过程在您附加到事件之前退出。上面的代码是更正确的doint方式。