Приложение C # WinForms: остановка / прерывание приложения Windows Forms - PullRequest
2 голосов
/ 15 августа 2010

Среда: .net 3.5 WinForms application

Я ищу несколько идей, как остановить / прервать приложение Windows Form, например, когда «что-то» занимает слишком много времени. Типичным сценарием является чтение большого объема данных из бэкэнд-системы, и пользователь должен иметь возможность нажать некоторую клавишу, чтобы немедленно остановить загрузку.

  1. Нормальные события недостаточно отзывчивы, поскольку бэкэнд-вызов так или иначе занимает так много времени, что он не реагирует быстро.
  2. В моих методах чтения я добавил явные проверки - но я не могу добавить такие проверки в сторонние фреймворки. И это как-то не очень хороший подход.

Может быть, у кого-то есть идея, как надежно и быстро остановить некоторые запущенные методы. Могу ли я использовать прерывание?

С уважением, HW

Ответы [ 4 ]

4 голосов
/ 15 августа 2010

Нормальные события недостаточно отзывчивы, поскольку бэкэнд-вызов так или иначе отнимает так много времени

Это не так.Понять «цикл сообщений» очень важно, обязательно прочитайте его.Короче говоря, Windows может сообщить вашей программе, что кнопка была нажата только тогда, когда основной поток программы находится в режиме ожидания.Ваш основной поток всегда должен быть бездействующим, готовым приступить к действиям, когда необходимо выполнить некоторую часть работы.Как рисовать форму или обрабатывать нажатие клавиш.Или делать что-то, когда пользователь нажимает кнопку Отмена.

Это означает, что что-то еще нужно сделать тяжелую работу.Тема.Безусловно, лучший способ начать работу в беспокойном мире многопоточности - это класс BackgroundWorker.У него есть метод CancelAsync (), явно разработанный для того, чтобы делать то, что вы хотите.Обязательно ознакомьтесь с примером кода, приведенным в статье библиотеки MSDN для этого метода.

2 голосов
/ 15 августа 2010

Вы можете использовать класс BackgroundWorker, он абстрагируется от работы непосредственно с потоками, поэтому его немного проще реализовать.Вы просто создаете экземпляр BackgroundWorker и присоединяете к нему некоторые обработчики событий. Вот пример .

2 голосов
/ 15 августа 2010

Вы должны выполнять "long" = все операции длительностью более 1 / 5sec в отдельных потоках. Лучший способ завершить операцию - это создать некоторый «контекст» с переменной, которая сообщает рабочему потоку, хочет ли пользователь отменить операцию или нет.
Если у вас нет контроля над кодом, выполняющим операцию, и код .net, вы можете вызвать Thread.Abort (), но если код не .net, единственное, что вы можете сделать, это вызвать функцию api windows «terminatethread», но вы может произойти утечка некоторых ресурсов и не закрытие файлов, поэтому вам следует подумать об использовании дочернего процесса.

2 голосов
/ 15 августа 2010

Выполнить долгосрочный код в отдельном потоке.

Thread thread;
void StartLong()
{
  thread = new Thread(SomeMethod);
  thread.Start();
}

void SomeMethod()
{
  //Long running code here.
}

void CancelButton_Click(object sender, EventArgs e)
{
  //...
  thread.Abort();
}

Если у вас нет контроля над кодом, выполнение которого занимает много времени.Все, что вы можете сделать, отменить это, чтобы прервать поток.thread.Abort();

...