【问题标题】:Set a timeout waiting for userinput设置等待用户输入的超时时间
【发布时间】:2013-01-22 23:22:35
【问题描述】:

我有一个提示输入用户名和 PIN 的 C# .NET 3.5 应用程序。如果在 x 秒内没有输入 PIN,我希望应用程序自动重置。如果在 x 秒内按下某个键,则计时器应重置为 0 并重新开始。我四处搜索并找到了执行此操作的各种方法,使用计时器thread.wait,但我还没有找到我正在尝试完成的示例。我认为解决方案将涉及使用多个线程,但我以前从未这样做过,所以我不确定从哪里开始。

【问题讨论】:

    标签: c# winforms .net-3.5


    【解决方案1】:

    不需要那么聪明,除非它是一种你会经常重复使用的行为。 假设您以模态方式显示此表单

    在您的表单上设置一个计时器(已禁用) 在显示表单时启用。

    将 keydown/keypress 事件处理程序添加到可能具有焦点的框 在他们重新启动计时器

    如果计时器事件触发关闭返回合适的 DialogResult Cancel 的表单应该这样做。

    看到您在按键上重置时,拥有另一个线程没什么意义。如果你不重置,那么 M Patel 的答案就是要走的路,除非你想重新发明很多轮子

    【讨论】:

    • 我会试试这个方法。我没有关闭表单,它保持打开状态,我只是重置了一些控件购买更改可见性和文本属性。
    • 效果很好,谢谢!也只有几行代码!每天学习新东西
    • 这很简单,但需要大量维护。对于许多表单或对表单的许多更改(考虑在其他编辑框中绑定,但忘记连接 keypress 事件)。然后它可能会变得有点痛苦,但是制作一些聪明和可重复使用的东西是有成本的。将超时值作为参数是值得改进的。
    • 谢天谢地,这是一个非常简单的表格。一个在接受客户 ID 和 pin 之间更改状态的文本框,因此这是一个完美的解决方案。我确实将超时设置为一个参数,这对于根据用户行为计算出确切的超时非常有用。
    【解决方案2】:

    您可以使用示例here,它使用 IAsyncResult 接口和 Action 来执行此操作。我自己用过它,它就像一个魅力。为了简化事情,只需使用它,如下例所示

    Action wrappedAction = () =>
    {
        // show your input
    };
    
    IAsyncResult result = wrappedAction.BeginInvoke(null, null);
    
    if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
    {
        /// the user supplied an input and closed the form
        wrappedAction.EndInvoke(result);
    }
    else
    {
        // the code has timed out so close your input and throw error
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 2011-02-12
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多