我有一个使用C#开发的Windows应用程序。在这个应用程序中,我正在创建一个进程。 我想在Process_Exited()事件发生时启用和禁用几个按钮。 在Process_Exited()方法中,我编写了启用按钮的代码,但在运行时我得到错误
“跨线程操作无效: 控制 'tabPage_buttonStartExtraction' 从除以外的线程访问 它创建的线程。“
我的代码段是:
void rinxProcess_Exited(object sender, EventArgs e)
{
tabPage_buttonStartExtraction.Enabled = true;
tabPageExtraction_StopExtractionBtn.Enabled = false;
}
有人可以建议如何做到这一点吗?
答案 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上做太多工作,因为调用非常昂贵。