C# - 按钮/垃圾邮件时避免延迟

时间:2015-11-20 13:02:25

标签: c# winforms

如果我按键盘键,key_Down事件被触发一次,然后有一秒钟的延迟然后开始发送垃圾邮件,我该如何避免? 我正在使用C#WinForms,这将是我的代码:

private void key_Down(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Key.A)
        {
            // Do Stuff
        }
    }

4 个答案:

答案 0 :(得分:2)

只有通过一个标志才能响应事件,阻止处理程序执行操作"直到收到一个密钥。 keyup事件将重置标志。

所以:

bool isAKeyDown = false;
private void key_Down(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Key.A && !isAKeyDown )
    {
        isAKeyDown = true;
        // Do Stuff
    }
}
private void key_Up(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Key.A)
    {
        isAKeyDown = false;
    }
}

这显然只涉及一把钥匙。你可以选择在字典中保留一堆标志来标记许多键的状态。

因为在UI线程上调用了处理程序,所以您不必担心对处理程序中引用的变量的同步访问。

答案 1 :(得分:0)

当您在记事本中按住某个键时会发生这种情况。有一点延迟,然后它会增加你正在按下的很多角色。

您可以使用其他活动......按键事件可能更适合您。

答案 2 :(得分:0)

您可以取消订阅活动,并在1秒后订阅

 private void OnKeyDown(object sender, KeyEventArgs keyEventArgs)
    {
        this.KeyDown -= OnKeyDown;

        // Do Something

        Task.Delay(1000).ContinueWith(x => { this.KeyDown += OnKeyDown; });
    }

答案 3 :(得分:0)

您可以为第一个事件存储DateTime值,并将其与每个后续事件的当前时间进行比较:

private DateTime? dateFirstEvent;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (this.dateFirstEvent == null ||
        (this.dateFirstEvent != null && DateTime.Now.Subtract(this.dateFirstEvent.Value) > TimeSpan.FromSeconds(1)))
    {
        // Do stuff
        this.Text = DateTime.Now.Ticks.ToString();
    }

    if (this.dateFirstEvent == null)
    {
        this.dateFirstEvent = DateTime.Now;
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    // Resets date
    this.dateFirstEvent = null;
}

没有计时器,没有任务,没有新线程,非常简单。

相关问题