C# escape-ключ для прерывания вычислений в приложении winform
Я создал приложение Winform.
При нажатии на кнопку запускается процедура со многими вычислениями.
Я хотел бы иметь возможность правильно остановить процедуру, нажав клавишу escape.
Но есть несколько проблем :
Событие KeyDown, настроенное в основной форме, не может быть перехвачено во время выполнения процедуры.
Событие KeyDown не может быть обнаружено до тех пор, пока вызывающий объект (функция button_Click ()) не выполнит фокусировку на основной форме.
Событие keyDown, по-видимому, можно обнаружить только тогда, когда приложение доступно, на удержании.
Итак, я ищу очень простую вещь (нажмите ESC, чтобы остановить вычисление), но мне кажется, что это трудно сделать !
Кто-нибудь может мне помочь, пожалуйста ?
Большое спасибо.
Что я уже пробовал:
Я пробовал разные решения :
Я поместил процедуру вычисления в отдельный поток, запущенный кнопкой, функция button_Click() которой заканчивается сразу же после этого. Таким образом, становится возможным обнаружение события KeyDown. Таким образом, используя флаг, можно остановить процедуру, помещенную в поток.
Проблема заключается в том, что другие задачи, которые должны были следовать за окончанием вычислений, также должны быть помещены в поток, иначе невозможно продолжить операции в основном потоке.
Другой тест : используйте низкоуровневый крючок клавиатуры (https://www.youtube.com/watch?v=f5gLsA7wX5U). Это нормально, когда он используется в основном потоке и когда приложение находится в режиме ожидания (ожидания ввода данных пользователем), но если основной поток выполняет процедуру вычисления, то событие достигается только в конце вычисления.
Поэтому я решил поместить этот низкоуровневый захват клавиатуры в другой отдельный поток. Но я не знаю, как это сделать.
F-ES Sitecore
Правильное решение, по многим причинам, состоит в том, чтобы делать вычисления в их собственном потоке, поэтому придерживайтесь этого маршрута и подробно описывайте конкретную проблему, с которой вы столкнулись.
0x01AA
Очень простое, но и очень грязное решение может заключаться в том, что ваша процедура расчета вызывает Application.DoEvents();
периодически.
Гораздо лучше следовать совету в комментарии выше от @fes-sitecore, чтобы вычислить в отдельном потоке, например, используя background worker или whatelse.