【问题标题】:Button.Enabled = false is slow and allow double clickingButton.Enabled = false 很慢,允许双击
【发布时间】:2026-01-18 06:35:01
【问题描述】:

我正在尝试运行一个使用两人互动的网络实验。为了做到这一点,不允许双击是至关重要的。我使用以下代码(C#、ASP.NET):

            protected void decisionM2Button_Click(object sender, EventArgs e)
            {
            decisionM2Button.Enabled = false;
            decisionM1Button.Enabled = false;
            decisionP0Button.Enabled = false;
            decisionP1Button.Enabled = false;
            decisionP2Button.Enabled = false;
            }

当我在本地主机上运行应用程序时,按钮被禁用得足够快,以防止任何双击。在服务器上它不够快,当点击两三个按钮的速度足够快时,整个应用程序/实验就会卡住。

有没有办法解决这个问题?

谢谢!

【问题讨论】:

  • 为什么不用javascript来做呢?它降低了服务器的工作量,也可以即时反应

标签: c# asp.net


【解决方案1】:

客户端的解决方案速度很快,但也可以轻松绕过。

如果您对有效性感兴趣(显然您对此感兴趣,否则您只会告诉您的玩家不要点击两次,该死!:)),最好的方法是确保只计算第一次点击。根据您的应用程序,一个 Session 可能足以做您想做的事 - 在第一次单击时,在 Session 中设置一个值。每个按钮都将首先检查 Session,如果预期值已经存在,则立即返回。然后,您可以在适当的时候重置会话。

当然,还有很多其他方法可以存储这种状态,但我必须更多地了解你实际上想要做什么,以及在什么样的环境中。

【讨论】:

    【解决方案2】:

    点击后,不要禁用它,而是尝试分配一个 CSS 类来隐藏它..这可能足够快..

    您可以将 css 动态设置为您的按钮,如下所示:

     button.css="cssClassname";
    

    您可以通过动态 java 脚本执行的另一件事.. 调用 javscript 函数并从客户端而不是从服务器端禁用它..

    希望这会有所帮助..

    【讨论】:

      【解决方案3】:

      JavaScript / JQuery 将是您的选择 IMO,不过,客户端可以通过外部工具进行修改,所以请考虑一下。

      【讨论】:

        【解决方案4】:

        应用 ajax UpdateProgress 并将您的代码放在 UpdatePanel 中:

            <aspAtlas:UpdateProgress ID="upUpdatePanelProgress" runat="server" DisplayAfter="0"
                    DynamicLayout="true" AssociatedUpdatePanelID="updpnlProgram">
                    <ProgressTemplate>
                        <asp:Panel ID="Panel1" CssClass="overlay" runat="server">
                                <img runat="server" id="img1" src="../Images/UpdateProgress.gif" alt="Loading..." /><br />
                                <br />
                                <b>Loading...</b>
                            </asp:Panel>
                    </ProgressTemplate>
                </aspAtlas:UpdateProgress>
         <aspAtlas:UpdatePanel runat="server" ID="updpnlProgram" UpdateMode="Conditional">
                <ContentTemplate>
        <div>
        //--Your code in this div
        </div>
         </ContentTemplate>
                <Triggers>
                    <aspAtlas:PostBackTrigger ControlID="decisionM2Button" />
                </Triggers>
            </aspAtlas:UpdatePanel>
        

        【讨论】: