Почему я получаю сообщение об ошибке после закрытия приложения Windows Forms? - PullRequest
2 голосов
/ 02 октября 2008

Когда я запускаю свое приложение Visual Studio Windows Forms, нажимая F5 (режим отладки), после нажатия кнопки закрытия (которая вызывает Application.Exit()), через несколько секунд Я получаю сообщение об ошибке:

не может получить доступ к удаленному объекту: имя объекта 'SampleForm'.

Немного предыстории, у меня есть другой поток, который запускается каждые x секунд.

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

Это правильно?

Должен ли я уничтожить поток фонового процесса, прежде чем я вызову Application.Exit()?

Обновление

Теперь, когда я звоню thread.Abort() до вызова Application.Exit(), приложение полностью закрывается. Раньше, ДАЖЕ после того, как я нажимал на кнопку закрытия, отладчик все еще работал (то есть кнопка остановки не была выбрана), поэтому, должно быть, потому что поток все еще был активен.

Ответы [ 6 ]

4 голосов
/ 02 октября 2008

Отметьте ваш поток как BackgroundThread, и он прекратит работу, как только вы закроете окно.

3 голосов
/ 02 октября 2008

Я думаю, что режим отладки против выпуска - красная сельдь. В режиме выпуска вы просто не получаете диалоговое окно с ошибкой «невозможно получить доступ к удаленному объекту».

1 голос
/ 02 октября 2008

Установить поток для запуска в фоновом режиме Thread.IsBackground = true. По умолчанию это режим переднего плана, который заставляет его поддерживать процесс (даже если пользовательский интерфейс закрыт).

Прокрутите вниз до темы переднего плана и фона здесь для получения дополнительной информации

0 голосов
/ 02 октября 2008

Да, вам определенно нужно уничтожить созданные вами потоки. В этом случае вы проверяете, доступен ли объект пользовательского интерфейса, к которому вы обращаетесь, и, если это так, прерываете текущий поток. Другой возможностью было бы просто отслеживать ваши потоки и убивать их при выходе. Третья возможность - изучить системные области ThreadPool и BackgroundWorker, чтобы узнать, обрабатывают ли они какие-либо подобные способы управления жизненным циклом потоков.

0 голосов
/ 02 октября 2008

Убедитесь, что другой поток установлен в качестве фонового потока.

Также в Application.Exit сделайте otherThread.Join ()

0 голосов
/ 02 октября 2008

Да, вам нужно сначала убить поток.

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

РЕДАКТИРОВАТЬ: Согласно вашему обновлению, вы не должны прерывать поток. Поток должен получать сигнал и выходить сам по себе. Я не уверен, как выглядит ваш поток или код, но что-то вроде:

do {

    // Crazy threading stuff here

}while(_running);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...