4

我遇到了无法解决的“调用”问题。我会尽量详细地描述我的描述,但我是新手,所以请耐心等待,如果您需要更多信息,请告诉我。

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

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

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

4

2 回答 2

11

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

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

这将跳过ManualCurtainShutoff在后台线程上运行的其余执行,同时仍会在主线程上促进该方法的执行。

于 2013-06-26T00:59:55.400 回答
6

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

编辑:该死,当我写完的时候,我已经被打败了。那好吧!

于 2013-06-26T01:00:13.573 回答