进程退出后如何启用表单按钮?

时间:2011-01-05 06:07:00

标签: c# .net winforms multithreading process

我有一个使用C#开发的Windows应用程序。在这个应用程序中,我正在创建一个进程。 我想在Process_Exited()事件发生时启用和禁用几个按钮。 在Process_Exited()方法中,我编写了启用按钮的代码,但在运行时我得到错误

  

“跨线程操作无效:   控制   'tabPage_buttonStartExtraction'   从除以外的线程访问   它创建的线程。“

我的代码段是:

 void rinxProcess_Exited(object sender, EventArgs e)
 {
     tabPage_buttonStartExtraction.Enabled = true;
     tabPageExtraction_StopExtractionBtn.Enabled = false;
 }

有人可以建议如何做到这一点吗?

3 个答案:

答案 0 :(得分:3)

在单独的方法中移动启用/禁用行,并使用Control.Invoke方法从rinxProcess_Exited调用该方法。

答案 1 :(得分:2)

您必须在UI线程上进行UI更改。有关详细信息,请参阅this question

以下是适用于您的示例的解决方案:

void rinxProcess_Exited(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke((Action)(() => ProcessExited()));
        return;
    }

    ProcessExited();
}

private void ProcessExited()
{
    tabPage_buttonStartExtraction.Enabled = true;
    tabPageExtraction_StopExtractionBtn.Enabled = false;
}

答案 2 :(得分:2)

您正尝试从其他线程更改UI。 试试这样的事情;

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox1.InvokeRequired)
        {   
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }

你不应该在另一个线程的UI上做太多工作,因为调用非常昂贵。

来源:http://msdn.microsoft.com/en-us/library/ms171728.aspx