2

В файле Program.cs программы .Net CF 3.5 WinForms, которую я написал, я запускаю приложение, создавая экземпляр нового экземпляра Form1.Как убить процесс приложения форм Windows Mobile 6.1 при закрытии формы?

Application.Run(new Form1()); 

Когда я хочу, чтобы закрыть/выйти из приложения, я переопределить событие Form1 FormClosed, чтобы я мог обеспечить выход из приложения.

// In Form1 code-behind 
private void OnFormClosed(object sender, EventArgs e) 
{ 
    Application.Exit(); // Doesn't kill process 
} 

При выполнении этого кода, я хочу, чтобы приложение, чтобы исчезнуть с экрана (близко), и я хочу, чтобы процесс был запущен, чтобы умереть. Приложение закрывается (исчезает), но, к сожалению, процесс (мы будем называть его app.exe) все еще работает бесконечно. Когда я снова запустил приложение и закрою его, он запустит еще один процесс app.exe и т. Д. Таким образом, процесс никогда не умирает, и еще больше создается еда памяти.

Как я могу обеспечить, чтобы этот процесс был убит, когда я закрываю/закрываю приложение? Благодарю.

ответ

4

Во-первых, вам не нужно переопределять OnFormClosed, чтобы получить поведение, которое вам нужно. Просто закрыв форму, переданную в Application.Run, выйдет сообщение для насоса приложения, и должно привести к завершению процесса. Для Windows Mobile вы должны установить свойство ShowMinimize формы на false, чтобы предотвратить ее минимизацию - у вас должно быть (ОК) в правом верхнем углу, а не (X).

Если процесс не завершается, когда эта форма закрывается, то виновником 99.99% времени является то, что у вас есть рабочий поток, который все еще работает, препятствуя закрытию процесса. Убедитесь, что у всех ваших потоков IsBackground установлено значение true (для CF 3.5), и в качестве меры предосторожности все ваши потоки также должны иметь форму уведомления или флага. Не полагайтесь на завершающий процесс, чтобы оторвать их от вас.

+0

Спасибо, ctacke. BTW отличный блог. Это помогало несколько раз. Я новичок в этом типе развития. Как вы программно обнаруживаете, есть ли рабочие потоки? У каждого нового экземпляра Form есть собственный поток? У меня есть несколько статических форм, запущенных в приложении, в котором я переключаюсь между ними, но я использовал Form1 в качестве начальной и конечной точки (aka: application «host»), думая, что когда я закрою это, все остальные закроются. – radian21

+0

Вы можете программно определять потоки, но здесь это не нужно.В большинстве случаев поток будет тем, который вы создали в коде, вызвав новый поток (или, возможно, ThreadPool.QueueWorkItem). Формы не создают потоки (если вы явно не написали для нее код). – ctacke

2

Ваша проблема в том, что у вас есть Form.MinimizeBox = true. Измените его на false и форма будет закрыта когда нормально нажата вместо минимизированы при х щелкают.

Есть несколько вещей, чтобы рассмотреть в вашем вопросе:

Я отменяю событие Form1 FormClosed

  • Там нет FormClosed событий для форм типа System.Windows.Forms.Form, только Closing и Closed.
  • Вы не переопределить событие. Вы переопределяют виртуальную функцию из базового класса или интерфейса.