方法在被调用后执行两次

本文关键字:两次 执行 调用 方法 | 更新日期: 2023-09-27 18:20:04

我遇到了一个无法解决的"invoke"问题。我会尽可能详尽地描述,但我是新手,所以请耐心等待,如果你需要更多信息,请告诉我。

我有一个后台线程正在运行,当提示时,它将禁用在主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用invoke和委托安全地跨线程,但我一定做得不正确。最重要的是,当我在调试器中检查这一点时,我看到它在InvokeRequired的情况下运行了两次代码的ACTION部分。我可以通过用else括起ACTION来绕过这一点,尽管它不会运行两次else,但它仍然会尝试再次运行该方法。

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

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

方法在被调用后执行两次

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

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

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

Invoke将导致函数在另一个线程中再次被调用(这就是它的目的)。您应该在调用Invoke之后添加一个返回。其想法是,然后您的函数将被再次调用(这正是您想要的),并且InvokeRequired时间将为false,因此您的操作将发生。

编辑:当我写完的时候,我已经被打得落花流水了。哦,好吧!