我遇到了无法解决的“调用”问题。我会尽可能详尽地描述我的内容,但我是新手,所以请多多包涵,如果您需要更多信息,请告诉我。
我有一个正在运行的后台线程,当出现提示时,它会禁用在主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用 invoke
和委托(delegate)来安全地跨线程,但我一定是做错了。最重要的是,当我在调试器中检查它时,我发现如果 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
的其余执行,同时仍然促进新方法的执行主线程。
关于c# - 方法被调用后执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309924/