Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/39: Рейтинг темы: голосов - 39, средняя оценка - 4.92
34 / 30 / 10
Регистрация: 24.11.2014
Сообщений: 188
Записей в блоге: 12
.NET 4.x

Форма с фоновым потоком. Ошибка при закрытии формы

02.09.2015, 00:07. Показов 8331. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую!

Есть приложение, состоящее из формы и фонового потока (класс Thread), который выполняет некую длительную операцию. Форма используется для того, чтобы ввести исходные данные и информировать пользователя о ходя процесса. Также на ней есть кнопки Старт и Стоп.

Примерный вид функции потока представлен ниже. При нажатии на кнопку Стоп во время работы потока вызывается функция Abort() и процесс успешно завершается, но при закрытии формы с работающим процессом возникает исключение на первом Invoke в блоке catch. Скорее всего оно связано с тем, что форма уничтожается раньше потока. Пробовал вызывать Abort() в FormClosed и FormClousing. Не помогло.

Подскажите, пожалуйста, как правильно поступить в данном случае? Просто глушить исключение не хотелось бы))

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     
private void ThreadProc()
{
    try
    {
        // код фонового потока
    }
    catch
    {
        this.Invoke((MethodInvoker)(() => btnStart.Enabled = true));
        this.Invoke((MethodInvoker)(() => btnStop.Enabled = false));
    }
    finally
    {
        this.Invoke((MethodInvoker)(() => btnStart.Enabled = true));
        this.Invoke((MethodInvoker)(() => btnStop.Enabled = false));
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2015, 00:07
Ответы с готовыми решениями:

Многопоточность, ошибка при закрытии формы
При закрытии формы возникает Exception "Доступ к ликвидированному объекту невозможен." В чем может быть дело и как решить эту...

Ошибка при закрытии дочерней формы
Привет! Есть баг, который никак не могу исправить. Существуют 2 формы Form1 и Form2, при этом Form1 - Главная, а Form2 - дочерняя. ...

При закрытии второй формы выскакивает ошибка
При закрытие второй формы выскакивает ошибка Открываю вторую форму private void button1_Click(object sender, EventArgs e) ...

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
02.09.2015, 01:14
Aleks_U,
1) Не очень понятно зачем вы обрабатываете и catch и finally, да еще и по два раза Invoke вызываете. Можно же обрабатывать только finally. А число вызовов Invoke тоже лучше не плодить.
2) По сути вопроса. Когда приложение завершается, главное окно уничтожается и уничтожается его очередь обработки сообщений. Метод же Invoke работает именно с помощью очереди обработки сообщений. Он посылает сообщение в очередь и ожидает его обработки. Логично, что если окно уже уничтожено, то очередь не обрабатывается и Invoke выпадает в исключение.
Как это исправить? Просто: вместо Invoke, вызывайте BeginInvoke. Метод BeginInvoke также отправляет сообщение в очередь, но не ожидает его обработки. Если очередь уже уничтожена, он просто вернет управление, форма успешно закроется, а сообщение так никогда и не будет обработано. Что вам и требуется.
C#
1
2
3
4
5
6
7
8
            try
            {
                // код фонового потока
            }
            finally
            {
                this.BeginInvoke((MethodInvoker)delegate{ btnStart.Enabled = true; btnStop.Enabled = false;});
            }
1
34 / 30 / 10
Регистрация: 24.11.2014
Сообщений: 188
Записей в блоге: 12
02.09.2015, 09:55  [ТС]
Спасибо. Теперь все работает.

Что finally в данном случае правильнее чем catch тоже не додумался) В этом случае код ведь выполнится не только при прерывании потока, но и при нормальном завершении, что мне и нужно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2015, 09:55
Помогаю со студенческими работами здесь

Как выполнить код в закрытии формы при ее принудительном закрытии?
Привет всем) Суть вопроса такова: есть форма, и при её закрытии нужно выполнить код. Если закрывать форму на крестик или...

Переход от одной формы к другой и ошибка при закрытии одной из них
Здравствуйте! Есть 2 формы. Из одной перехожу во вторую по нажатию кнопки, со второй возвращаюсь в первую 2мя способами: 1) при закрытии...

Ошибка при закрытии формы "System.ArgumentOutOfRangeException" в mscorlib.dll
Гайз, нужна помощь. Гугл не помог, вся надежда на вас. Офк есть подозрения что проблема настолько в базовых вещах, что я просто туплю и...

Ошибка "Невозможно вызвать Invoke или BeginInvoke." при закрытии формы
Всем привет! Когда закрываю приложение если строка 78 закомментирована, то в строке 80 появляется исключение "Невозможно вызвать...

Не получается при закрытии формы 2 изменить текст label формы 1
Форма 1: private void Btn_Open_Form2_Click(object sender, EventArgs e) { Form2 forma2 = new Form2(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru