【问题标题】:Application exits on process exited event应用程序退出进程退出事件
【发布时间】:2012-01-04 12:41:06
【问题描述】:

我正在制作表单应用程序,它也在不同的线程上运行控制台进程。基本上我需要在应用程序退出后取消阻止按钮。在我制作事件处理程序之前,完成后的进程刚刚停止,但现在,在事件发生后应用程序本身被杀死。

这是使进程运行的代码:

public void CallConsole()//This Calls the console application
{
    Thread.CurrentThread.IsBackground = true;
    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.FileName = filename;
    if (checkBox1.Checked)
       p.StartInfo.CreateNoWindow = true;
    p.EnableRaisingEvents = true;
    p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    p.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    p.Exited += new EventHandler(p_Exited);
    p.Disposed += new EventHandler(p_Exited);
    p.Start();
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();
}

我尝试使用 Thread.IsBackground 属性,但这并没有改变任何东西

这是事件处理程序本身:

void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 avalable
{
    button1.Enabled = true;
}

添加后应用程序的任何想法

p.EnableRaisingEvents = true;

现在被杀死了,不仅仅是进程?

【问题讨论】:

    标签: c# winforms events process


    【解决方案1】:

    这里的问题是

    void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 available
    {
        button1.Enabled = true;
    }
    

    需要调用并且没有任何类型的错误处理。一旦我添加了另一个检查button1.InvokeRequired 的函数,并且如果它确实通过调用再次调用自己,它的效果很好

    【讨论】:

      【解决方案2】:

      这里的问题是Exited 事件在线程池线程上触发。控件只能在 UI 线程上修改。

      您可以调用BeginInvoke,但更简单的是配置Process 对象以通过设置调用自身:

      p.SynchronizingObject = button1;
      

      Button 实现 ISynchronizeInvokeProcess 对象使用它来调用其事件。

      【讨论】:

      • 我一直在寻找这样的答案。非常感谢。