我遇到了一个无法解决的“调用”问题。我会尽量在描述中尽可能彻底,但我是新手,请耐心等待,如果您需要更多信息,请告诉我。
我有一个后台线程运行,当提示时将禁用主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用invoke
和委托安全地进行交叉线程,但我必须做错了。最重要的是,当我在调试器中检查这个时,我发现如果InvokeRequired
,它会在代码的ACTION部分运行两次。我可以通过使用else
包围ACTION来解决这个问题,虽然它不会在else
两次运行,但它仍然会尝试再次通过该方法。
delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
if (InvokeRequired)
{
Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));
}
// ACTION: Disable check boxes
}
我只想知道为什么它会两次运行该方法。如果您需要更多信息,请告诉我,我很乐意与您分享。
答案 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将是假的,所以你的行动将会发生。
编辑:当我完成写作时,我已经被击败了。哦,好吧!