Форма c # windows не отвечает во время многопоточности - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть форма окна с двумя функциями: первый загружает несколько строк в базу данных и вторая функциональность заключается в обработке этих строк с использованием заданного количества потоков, потому что скорость обработки данных очень важна в моем проекте, поэтому я не могу рассмотреть возможность не использовать многопоточность.

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

Более подробно при обработке события нажатия кнопки я инициирую все потоки и после этого я зацикливаю все темы

for (int i = 0; i < threads.Length; i++)
{
      threads[i].Join();
}

во время события нажатия кнопки для остановки I

for(int i=0;i<threads.Length;i++)
{
     if(threads[i].IsAlive)
     threads[i].Abort();
}

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

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

Ответы [ 2 ]

5 голосов
/ 30 декабря 2010

Я предполагаю, что вы выполняете цикл соединения в главном потоке. Это означает, что цикл обработки сообщений останавливается до тех пор, пока последний поток не завершит работу, победив многопоточность. И блокирует обработку всех событий, в том числе нажатий кнопок.

Кроме того, вы не должны использовать Thread.Abort ()

Вам придется подумать о лучшем плане

  • код потока должен проверять флаг остановки
  • Если вам абсолютно необходим этот join-patten, сделайте это из другого потока. Возможно от фонового работника.
3 голосов
/ 30 декабря 2010

Вызов Join заставляет ваш основной поток ждать всех других потоков и противодействует вашей многопоточности, именно то, что вам не нужно. Вызов Abort прекращает цепочку и не дает вам никаких результатов. Не делай этого.

Можно настроить поток с обратными вызовами, чтобы он возвращал результаты, и опросить, нужно ли отменять поток, но проще всего использовать BackgroundWorker, класс .Net, разработанный специально для того, что вы пытаетесь сделать. В Code Project есть хороший учебник .

...