小编Dis*_*ame的帖子

调用后执行两次的方法

我有一个"调用"问题,我无法解决.我会尽量在我的描述中尽可能彻底,但我是新手,所以请耐心等待,如果您需要更多信息,请告诉我.

我有一个运行后台线程,当提示时将禁用主线程上创建的表单上的一堆复选框.为了做到这一点,我需要使用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)

我只想知道为什么它会两次运行该方法.如果您需要更多信息,请告诉我,我很乐意与您分享.

c# multithreading invoke invokerequired

3
推荐指数
2
解决办法
3279
查看次数

跨线程隐藏方法

我试图从辅助线程隐藏在主线程上创建的表单,但是当我调用 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)

当我调试它时,它看起来并不执行任何操作。它似乎只是传递命令。再次,我是新手,所以欢迎任何和所有解释。

c# multithreading

1
推荐指数
1
解决办法
1972
查看次数

标签 统计

c# ×2

multithreading ×2

invoke ×1

invokerequired ×1