交叉穿线隐藏方法

本文关键字:隐藏 方法 | 更新日期: 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));