【发布时间】:2013-01-22 23:22:35
【问题描述】:
我有一个提示输入用户名和 PIN 的 C# .NET 3.5 应用程序。如果在 x 秒内没有输入 PIN,我希望应用程序自动重置。如果在 x 秒内按下某个键,则计时器应重置为 0 并重新开始。我四处搜索并找到了执行此操作的各种方法,使用计时器thread.wait,但我还没有找到我正在尝试完成的示例。我认为解决方案将涉及使用多个线程,但我以前从未这样做过,所以我不确定从哪里开始。
【问题讨论】:
我有一个提示输入用户名和 PIN 的 C# .NET 3.5 应用程序。如果在 x 秒内没有输入 PIN,我希望应用程序自动重置。如果在 x 秒内按下某个键,则计时器应重置为 0 并重新开始。我四处搜索并找到了执行此操作的各种方法,使用计时器thread.wait,但我还没有找到我正在尝试完成的示例。我认为解决方案将涉及使用多个线程,但我以前从未这样做过,所以我不确定从哪里开始。
【问题讨论】:
不需要那么聪明,除非它是一种你会经常重复使用的行为。 假设您以模态方式显示此表单
在您的表单上设置一个计时器(已禁用) 在显示表单时启用。
将 keydown/keypress 事件处理程序添加到可能具有焦点的框 在他们重新启动计时器
如果计时器事件触发关闭返回合适的 DialogResult Cancel 的表单应该这样做。
看到您在按键上重置时,拥有另一个线程没什么意义。如果你不重置,那么 M Patel 的答案就是要走的路,除非你想重新发明很多轮子
【讨论】:
您可以使用示例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
}
【讨论】: