异步延迟在KeyDown事件中的e.handled

时间:2014-10-18 10:16:17

标签: c# asynchronous async-await

我们假设我们有这个:

private void Input_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
}

然后我像这样添加async-await

private async void Input_KeyDown(object sender, KeyEventArgs e)
{
    await Task.Delay(1000);
    e.Handled = true;
}

不应该这样做,但只延迟一秒钟吗?那么为什么不呢?

注意:

我没有寻求调试帮助,我只是想知道为什么我不能使用async-await来延迟处理KeyDown

2 个答案:

答案 0 :(得分:5)

  

我只是想知道为什么我不能使用async-await来延迟处理KeyDown

根据定义,事件处理程序是同步的。因此,除非您的代码有办法通知事件处理程序它是异步行为(例如,WinStore样式的Deferral),否则它必须执行所有"通信" (例如,KeyEventArgs.Handled)在其第一个await之前。

如果您需要延迟输入,我建议您将代码转换为使用Reactive Extensions

答案 1 :(得分:0)

问题在于您尝试在事件处理程序中使用await。 "同步部分"事件处理程序什么都不做。

void OnKeyDown()
{
    Keys keyData = ...;
    KeyEventArgs args = new KeyEventArgs(keyData);
    // Thread-safe event raiser, 
    // equalient to KeyDown(this, args);
    RaiseKeyDownEvent(args);
    // Returns immediatelly when you reach
    // the first await method call
    bool isHandled = args.Handled;
    // In the meantime event handler
    // is awaiting for Task.Delay(),
    // but we have already saved Handled value
}

// This code does nothing useful
private async void Input_KeyDown(object sender, KeyEventArgs e)
{
    // Will return there
    await Task.Delay(1000);
    // The execution will be continued from there
    e.Handled = true;
}

// But this code will handle input, but without any delay
private async void Input_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
    await Task.Delay(1000);
}
相关问题