交叉穿线隐藏方法
本文关键字:隐藏 方法 | 更新日期: 2023-09-27 18:20:32
我试图向次线程隐藏在主线程上创建的表单,但当我调用隐藏方法时,显然会遇到跨线程问题。我是新手,对如何纠正这一点一无所知。我总是创建一个委托来调用我的方法,如果它正在更改在主线程上创建的东西,但我不知道如何在这里为内置的隐藏方法做到这一点。如果你需要更多信息,请告诉我。
代码:
public partial class MainForm : Form
{
ControlPanelForm m_controlPanel = new ControlPanelForm();
// ....
void MeterThread()
{
while (true)
{
// ....
if (EMOdetected)
{
m_controlPanel.Deinitialize();
m_controlPanel.Hide(); // **** //
}
}
}
}
基本上,我的MainForm会调出一个控制面板表单来完成一些工作。在后台,我有一个线程在运行并检查东西,其中一个是紧急关闭,此时我想关闭我的控制面板,然后隐藏它。
如果我试图在那里调用它,
m_controlPanel.Invoke(new EMOHandler(m_controlPanel.Hide)); // **** //
当我调试它时,它看起来并没有执行任何东西。它似乎只是传递了命令。再说一次,我是新手,所以欢迎任何解释。
没有理由检查InvokeRequired
或创建匿名方法。只需写入
mainForm.Invoke(new MethodInvoker(mainForm.Hide));
您没有给出任何代码方面的信息,但这是从非UI线程操作UI线程的常见模式。
if (mainForm.InvokeRequired)
{
mainForm.Invoke(new Action(() =>
{
mainForm.Hide();
}));
}
else
mainForm.Hide();
作为一个简单的规则,您已经指出:您不应该从另一个线程访问一个窗口
我建议你这样做:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(SampleFunction).Start();
}
public void AppendTextBox(string value)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(AppendTextBox), new object[] {value});
return;
}
textBox1.Text += value;
}
void SampleFunction()
{
// Gets executed on a seperate thread and
// doesn't block the UI while sleeping
for(int i = 0; i<5; i++)
{
AppendTextBox("hi. ");
Thead.Sleep(1000);
}
}
}
这是一个关于如何使用"多线程"的非常好的例子,我就是从这里得到的。
尽管在您的案例中,方法Hide
已经存在于MainForm上,并且实际上在等待您被调用,就像其他人已经指出的那样:
mainForm.Invoke(new MethodInvoker(mainForm.Hide));