我们假设我们有这个:
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
答案 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);
}