我有一个"调用"问题,我无法解决.我会尽量在我的描述中尽可能彻底,但我是新手,所以请耐心等待,如果您需要更多信息,请告诉我.
我有一个运行后台线程,当提示时将禁用主线程上创建的表单上的一堆复选框.为了做到这一点,我需要使用invoke和委托安全地交叉线程,但我必须做错了.最重要的是,当我在调试器中检查这个时,我看到它会在代码的ACTION部分运行两次InvokeRequired.我可以通过用一个包围ACTION来解决这个问题else,虽然它不会运行else两次,但仍然会尝试再次通过该方法.
delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
if (InvokeRequired)
{
Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));
}
// ACTION: Disable check boxes
}
Run Code Online (Sandbox Code Playgroud)
我只想知道为什么它会两次运行该方法.如果您需要更多信息,请告诉我,我很乐意与您分享.
我试图从辅助线程隐藏在主线程上创建的表单,但是当我调用 hide 方法时,我显然遇到了跨线程问题。我是新手,并没有真正知道如何纠正这个问题。如果它正在更改在主线程上创建的内容,我总是只创建一个委托来调用我的方法,但我不知道如何在此处为内置的 hide 方法执行此操作。如果您需要更多信息,请与我们联系。
代码:
public partial class MainForm : Form
{
ControlPanelForm m_controlPanel = new ControlPanelForm();
// ....
void MeterThread()
{
while (true)
{
// ....
if (EMOdetected)
{
m_controlPanel.Deinitialize();
m_controlPanel.Hide(); // **** //
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我的 MainForm 拉出一个控制面板表单,它可以做一些工作。在后台,我有一个线程正在运行并检查内容,其中之一是紧急关闭,此时我想关闭我的控制面板,然后将其隐藏。
如果我尝试在那里调用它,
m_controlPanel.Invoke(new EMOHandler(m_controlPanel.Hide)); // **** //
Run Code Online (Sandbox Code Playgroud)
当我调试它时,它看起来并不执行任何操作。它似乎只是传递命令。再次,我是新手,所以欢迎任何和所有解释。