2015-12-22 4 views
3

Я сделал консольное приложение Windows в C#, которое делает некоторые вычисления. Окно приложения невидимо для пользователя, приложение запускается как задача.Как предотвратить закрытие приложения перед завершением задачи?

Эти расчеты сохраняются в базе данных. К сожалению, если пользователь закрывает это приложение во время сохранения данных (путем выключения компьютера), и не все данные будут сохранены, мои вычисления не будут иметь смысла.

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

+2

Собственно, вы должны помнить, что пользователь всегда имеет право решать, когда закрыть программу. Возможно, вы должны добавить «поле сбоя» где-нибудь в начале вычислений и удалить его в конце, поэтому, когда вы проверяете, если он установлен, вы можете предположить, что данные повреждены. – Desaroll

+2

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

+2

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

ответ

6

Я считаю, что вы пытаетесь решить неправильную проблему здесь.

В большинстве случаев вы можете сделать нить, чтобы приложение было живым, установив свой System.Threading.Thread.IsBackground на false. Но это далека от надежности, так как пользователь всегда сможет убить ваш процесс способами, которые выходят из-под контроля (отправка сигнала об утере в ваш процесс, вытаскивание вилки питания и т. Д.).

Вместо этого обратите внимание, что вы говорите, что выполняете некоторые вычисления и сохраняете их в базе данных, и вычисления «не имеют смысла», если их сохранение прерывается (как я понимаю, вы имеете в виду, что целостность базы данных будет скомпрометирована). Это звучит как пример использования для database transactions.

Идея состоит в том, что вы отправляете свои расчеты как одну транзакцию и позволяете системе управления базами данных обеспечить atomicity, consistency, isolation and durability каждой единицы работы и сохранить целостность вашей базы данных. Способ сделать это зависит от вашей СУБД, но основная идея такая же.

Смежные вопросы