Как я могу убедиться, что консольная программа C # ВСЕГДА завершается? - PullRequest
2 голосов
/ 17 ноября 2011

Я написал небольшое консольное приложение на C #, которое используется многими пользователями на сервере общего хранилища. Время выполнения всегда должно быть <3 секунды или около того, и запускается автоматически в фоновом режиме, чтобы помочь другому приложению с графическим интерфейсом, которое пользователь действительно пытается использовать. Из-за этого я хочу убедиться, что программа ВСЕГДА завершается полностью, независимо от того, выдает ли она ошибку или нет. </p>

В Application_Startup у меня есть базовая структура:

try
{
    // Calls real code here
}
catch
{
    // Log any errors (and the logging itself has a try with empty catch around it
    // so that there's no way it can causes problems)
}
finally
{
    Application.Shutdown();
}

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

Итак, как получается, что мое приложение, похоже, становится зависающим процессом на компьютерах людей с имеющейся у меня структурой кода? Чего мне не хватает?

Редактировать: Добавлено «Приложение». разрешить ShutDown () для ясности.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Здесь есть два варианта:

  1. Ваше консольное приложение на самом деле не заканчивается через 3 секунды, а, скорее, занимает гораздо больше времени.Вам нужно отладить его и посмотреть, что займет так много времени.
  2. Вашему консольному приложению требуется 3 секунды для выхода, но оно запускается каждую минуту графическим интерфейсом пользователя, и у вас более 40 пользователей, поэтому вероятностьобнаружение неиспользуемого исполняемого файла невелико.

Если это первый и вы не хотите его отлаживать, вы всегда можете запустить второй поток, подождать 3 секунды и затем завершить весь процесс.

1 голос
/ 17 ноября 2011

Может быть, код внутри блока try все еще выполняется по крайней мере для одного из клиентов и на самом деле не ограничен 3 или около того. Чтобы предотвратить такой случай, вам понадобится многопоточное приложение - один поток для обработки и один в фоновом режиме, убивающий рабочий поток после истечения времени ожидания. Перед этим вы должны спросить себя, действительно ли нужна такая инфраструктура.

Еще одна вещь, которая приходит на ум, это то, что приложение было запущено в данный момент одним из пользователей, вероятность зависит от количества ваших пользователей.

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

...