Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步以延迟在KeyDown事件中处理的e_C#_Asynchronous_Async Await - Fatal编程技术网

C# 异步以延迟在KeyDown事件中处理的e

C# 异步以延迟在KeyDown事件中处理的e,c#,asynchronous,async-await,C#,Asynchronous,Async Await,假设我们有: private void Input_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; } 然后我添加了async wait,如下所示: private async void Input_KeyDown(object sender, KeyEventArgs e) { await Task.Delay(1000); e.Handled = true; } 这不应该做同样的事情,但只是延迟

假设我们有:

private void Input_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
}
然后我添加了
async wait
,如下所示:

private async void Input_KeyDown(object sender, KeyEventArgs e)
{
    await Task.Delay(1000);
    e.Handled = true;
}
这不应该做同样的事情,但只是延迟一秒钟吗?那为什么不呢

注意:


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

问题是您试图在事件处理程序中使用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);
}
我只是想知道为什么我不能使用async Wait来延迟处理KeyDown

根据定义,事件处理程序是同步的。因此,除非您的代码能够通知事件处理程序它正在异步运行(例如,WinStore风格的延迟),否则它必须在第一次
等待之前完成所有“通信”(例如,
KeyEventArgs.Handled


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

它可以做什么呢?没有什么,就像它从来就不存在一样~@MilenPavlov事件处理程序应该是
async void
没错,所以当我像在那里一样使用async时,它应该在一秒钟后从
KeyDown
中删除我键入的任何内容,对吗?但事实并非如此!这就是我的意思。你混淆了KeyEventArgs。用KeyEventArgs.SuppressKeyPress处理。只有后者才能阻止处理键入的键。当您等待延迟时,这将不起作用,延迟到期时按键事件已经触发,并且按键已经添加到控件中。现在将SuppressKeyPress设置为true为时已晚。是的,我知道它没有任何作用,但为什么不呢?当我按下
g
按钮直到
e.handled
执行,然后
g
被删除时,它不应该输入例如
g
,因为事件处理程序是同步执行的。Windows窗体事件处理程序是同步的,因此“async void”实际上开始在不同的线程上执行代码。请参阅我对OnKeyDown()方法的评论,您可以通过C#在Richter的CLR中进一步阅读。“async void”实际上开始在不同的线程上执行代码。事实并非如此。
async void
并没有使它在另一个线程上调用的任何内容。相反,事件处理程序将在UI线程上执行。@YuvalItzchakov这是一个简化,目的是解释为什么这段代码不起作用。否则,复制粘贴里克特书中的整章内容将花费大量时间:)