方法在被调用后执行两次
本文关键字:两次 执行 调用 方法 | 更新日期: 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,因此您的操作将发生。
编辑:当我写完的时候,我已经被打得落花流水了。哦,好吧!