【问题标题】:Method executing twice after being invoked方法被调用后执行两次
【发布时间】:2013-06-26 00:55:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# multithreading invoke invokerequired


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 2013-12-31
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 2020-07-16
        • 2014-09-02
        • 1970-01-01
        • 2014-05-22
        相关资源
        最近更新 更多