c# - 方法被调用后执行两次

标签 c# multithreading invoke invokerequired

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

我有一个正在运行的后台线程,当出现提示时,它会禁用在主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用 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/

相关文章:

c# - 向网络服务添加参数是否有害?

c# - 我必须 Invoke() 才能显示线程中的对话框或 MessageBox 吗?

wpf - 如何使用 Dispatcher.Invoke 返回值?

c# - 使用 Hangfire 和 Asp.Net Core 的重复作业

c# - 如何隐藏控制台应用程序的黑屏?

java - 一个方法依赖于类中的另一个方法

c++ - 如何使用 boost::thread 暂时暂停其他线程?

c# - 多线程问题

amazon-web-services - AWS Lambda 函数出现问题,cloudwatch 上调用错误

c# - MVVMLight 中的 IoC 容器 - 如何将具体实现传递给指定的元素?