У меня есть небольшая форма, которая создает два фоновых рабочих потока, которые прослушивают сообщения от двух отдельных серверных процессов. Когда пользователь пытается закрыть форму, я обрабатываю событие OnFormClosing (или они могут щелкнуть пункт меню «Выход»), которое вызывает CancelAsync () в обоих потоках. Затем форма ожидает, пока свойство IsBusy для обоих потоков не станет "FALSE", прежде чем вызывать Environment.Exit (0).
Вот загвоздка: из этой формы пользователь может запустить отдельное приложение. Это делается с помощью Process.Start при нажатии определенной кнопки. Если пользователь создал новый процесс через форму, а затем закрывает форму, вместо изящного выхода происходит сбой, и я получаю одно из этих сообщений об ошибке Windows. Application.Exit не работает, потому что он не закрывает форму по неизвестной мне причине. Я уверен, что оба потока завершены, потому что я обрабатываю событие RunWorkerCompleted для обоих потоков. Вот оболочка основного кода:
private void startProcess_buttonClick(sender, e)
{
Process.Start(<process args>);
}
protected override OnFormClosing()
{
e.Cancel = true;
if (!thread1.IsBusy && !thread2.IsBusy)
Environment.Exit(0);
stopThreads();
}
private void stopThreads()
{
if (thread1.IsBusy)
thread1.CancelAsync();
if (thread2.IsBusy)
thread2.CancelAsync();
}
private void thread1_RunWorkerCompleted(sender, e)
{
if (!thread2.IsBusy)
Environment.Exit(0);
}
private void thread2_RunWorkerCompleted(sender, e)
{
if (!thread1.IsBusy)
Environment.Exit(0);
}
Любые идеи относительно того, что может вызвать сбой в Environment.Exit?
2 ответа
Пытаться
Application.Exit()
Поскольку вы используете Windows Forms. Я сам не делал тестовый пример, но я почти уверен, что API Winforms недовольны немедленным завершением процесса через среду, которая использует API ядра.
Я также нашел это: http://geekswithblogs.net/mtreadwell/archive/ 06.06.2004 / 6123.aspx
Как насчет
protected override OnFormClosing()
{
e.Cancel = true;
if (!thread1.IsBusy && !thread2.IsBusy)
this.Close();
stopThreads();
}
private void thread1_RunWorkerCompleted(sender, e)
{
if (!thread2.IsBusy)
this.Close();
}
private void thread2_RunWorkerCompleted(sender, e)
{
if (!thread1.IsBusy)
this.Close();
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.