2010-01-19 5 views
0

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

Моих бросить коды:

this.close(); 
application.quit(); 

Путь я переключаться между формами:

form2.show(); 
form1.hide(); 

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

Благодаря

+0

C# чувствительный к регистру. Это 'this.Close()' not 'this.close()' и т. Д. –

ответ

3

Процесс заканчивается, когда все потоки, которые не установлены в качестве фоновых потоков прекращается.

BackgroundWorker внутренне вызывает BeginInvoke на делегате, и это заставляет код запускать поток из ThreadPool. В потоках ThreadPool установлено значение IsBackground равным true, поэтому оно не должно вызывать зависание приложения. Маловероятно, что BackgroundWorker вызывает проблему.

Скорее всего, у вас есть место в вашем коде, где вы вручную создаете новый поток, используя new Thread() или аналогичный, и вы не задали этому члену темы IsBackground значение true.

+0

Я не использовал потоки напрямую, только к работникам фона, к сожалению, это не происходит при отладке, если я нажимаю «остановить отладку» только тогда, когда работать автономно, окна все закрыты, но процесс все еще существует! – Nath

+0

Используете ли вы какие-либо COM-компоненты или выполняете какую-либо интеграцию с Office, например. Excel или Word? У вас есть сторонние компоненты, которые могут воспроизводиться? –

1

Должно быть довольно легко прикрепить отладчик (вы можете получить Managed Stack Explorer, если у вас нет отладчика на машине, демонстрирующей проблему), и вы можете прорваться в процесс, чтобы увидеть, какие потоки выполняются в настоящий момент. В Visual Studio вы должны посмотреть в окне Threads и найти тот, который выполняет ваш код. Дважды щелкните по нему, затем загляните в окно «Стек вызовов», чтобы узнать, что происходит.