调用后执行两次的方法

时间:2013-06-26 00:55:05

标签: c# multithreading invoke invokerequired

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

我有一个后台线程运行,当提示时将禁用主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用invoke和委托安全地进行交叉线程,但我必须做错了。最重要的是,当我在调试器中检查这个时,我发现如果InvokeRequired,它会在代码的ACTION部分运行两次。我可以通过使用else包围ACTION来解决这个问题,虽然它不会在else两次运行,但它仍然会尝试再次通过该方法。

delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
    if (InvokeRequired)                                    
    {
        Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));           
    }
    // ACTION: Disable check boxes
}

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

2 个答案:

答案 0 :(得分:7)

仅仅因为你调用Invoke,它不会停止执行当前方法。一个快速而简单的解决方案是在调用return后简单地Invoke

delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
    if (InvokeRequired)                                    
    {
        Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));           
        return;
    }
    // ACTION: Disable check boxes
}

这将跳过在后台线程上运行的ManualCurtainShutoff的其余执行,同时仍然在主线程上提升方法的执行

答案 1 :(得分:3)

调用将导致您的函数在另一个线程中再次被调用(这就是它的目的)。您应该在调用Invoke之后添加一个返回。我们的想法是再次调用你的函数(这就是你想要的),那时InvokeRequired将是假的,所以你的行动将会发生。

编辑:当我完成写作时,我已经被击败了。哦,好吧!