2014-10-18 2 views
1

Давайте предположим, что мы имеем это:асинхронной к задержке e.handled в случае KeyDown

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

Что он вместо этого делает? – i3arnon

+0

ничего, как это никогда не бывает ~ – Enumy

+0

Обработчики событий @MilenPavlov должны быть 'async void' – i3arnon

ответ

5

я просто интересно, почему я не могу использовать асинхронный ждать, чтобы задержать обработки в KeyDown

обработчики событий синхронны по определению. Таким образом, если ваш код не имеет возможности сообщить обработчику событий, что он действует асинхронно (например, отсрочка в стиле WinStore), тогда он должен выполнить все «общение» (например, KeyEventArgs.Handled) до своего первого await.

Если вам нужно задержать ввод в целом, я рекомендую преобразовать код для использования Reactive Extensions.

+0

имеют смысл и много полезного, спасибо. – Enumy

0

Проблема в том, что вы пытаетесь для использования в обработчике событий. «Синхронная часть» обработчика событий ничего не делает.

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); 
} 
+0

Да, я знаю, что он ничего не делает, но почему бы и нет? не следует вводить, например. 'G', когда я нажимаю кнопку' G' до тех пор, пока 'e.handled' не выполнится, тогда' G' удаляется? – Enumy

+0

Поскольку обработчик события выполняется синхронно. Обработчики событий Windows Forms синхронны, поэтому «async void» фактически начинает выполнение вашего кода в другом потоке. См. Мои комментарии к методу OnKeyDown(), и вы можете читать дальше в CLR Рихтера через C#. –

+1

* «async void» фактически начинает выполнение вашего кода в другом потоке *. Это неправда. нет ничего о 'async void', который заставляет его ссылаться на другой поток. Напротив, обработчики событий будут выполняться в потоке пользовательского интерфейса. –