2013-06-26 63 views
2

我遇到无法解析的“调用”问题。我尽可能在我的描述中尽可能详尽,但我对此很陌生,所以请耐心等待,如果您需要更多信息,请告诉我。被调用后执行两次的方法

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

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

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

回答

5

仅仅因为你打电话给Invoke,它并不会停止执行当前的方法。一个快速和简单的解决方案是简单return调用Invoke后:

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

这将跳过这对后台线程运行,同时还对促进执行方法的ManualCurtainShutoff执行其余主线程。

2

调用将导致你的函数在不同的线程中被再次调用(这是它的目的)。您应该在调用Invoke之后添加一个返回值。这个想法是,然后你的函数将被再次调用(这就是你想要的),那个时间InvokeRequired将是错误的,所以你的行为将发生。

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