Могу ли я остановить программу во время выполнения любым другим способом, кроме как сгенерировав ошибку? - PullRequest
1 голос
/ 19 августа 2009

Есть ли команда, которая остановит выполнение моей программы?

У меня есть служба, которая обрабатывает обменный счет через telnet каждые 10 минут. В течение одной точки выполнения приложение может получить ответ от сеанса telnet, когда в папке НЕТ сообщений электронной почты, что будет выглядеть примерно так:

* 0 EXISTS

так что, поскольку это действительно не ошибка, я не хочу выдавать ошибку - я просто хочу остановить программу в этот момент. На самом деле для меня нет подходящего места для какого-либо сравнения счетчиков - не без переписывания большого количества кода, так что оператор If count < 0 Then ... в этом случае не будет работать, IMHO.

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

<ч /> ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ : Ответ от telnet генерируется в библиотеке классов. Программа не работает в winform или консольном приложении. Служба Windows вызывает метод из моего класса утилит, который запускает выполнение, вызывая другие классы в моем проекте. Этот ответ генерируется в одном из классов, который был запущен классом утилит.

Ответы [ 7 ]

4 голосов
/ 20 августа 2009

Environment.Exit - Завершает этот процесс и предоставляет базовой операционной системе указанный код выхода.

Environment.FailFast - Завершает процесс, но не выполняет никаких активных блоков try или finally или финализаторов.

2 голосов
/ 19 августа 2009

Если это приложение winforms, Application.Exit должно работать. Если это консольное приложение, то вы хотите return; из метода Main, хотя для правильной настройки может потребоваться некоторая работа, в зависимости от настроек вашей программы.

1 голос
/ 19 августа 2009

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

return;
0 голосов
/ 20 августа 2009

Оператор VB End остановит выполнение. Однако он не будет выполнять функции Dispose или Finalize. Я думаю, что лучше закрывать основную форму и / или выходить из Sub Main. Application.Exit также завершит работу программы vb.net, но только после некоторой обработки сообщений.

0 голосов
/ 20 августа 2009

В вашей службе вы можете обработать событие OnCustomCommand, а затем попросить ваш класс, который выполняет обработку telnet, отправить команду службе через метод ExecuteCommand класса System.ServiceProcess.ServiceController. Эта специальная команда в основном указывает службе останавливаться, что также может быть сделано объектом ServiceController.

Из вашего класса:

Dim oServCtl As System.ServiceProcess.ServiceController
oServCtl.ServiceName = "MyServiceName"
oServCtl.ExecuteCommand(128)

К вашим услугам:

Protected Overrides Sub OnCustomCommand(ByVal command As Integer)
    Dim oServCtl As System.ServiceProcess.ServiceController

    If command = 128 Then
        oServCtl = New System.ServiceProcess.ServiceController
        oServCtl.ServiceName = "MyServiceName"
        oServCtl.Stop()
        oServCtl.Close()
    End If
End Sub

Вы можете использовать пользовательские команды от 128 и выше.

0 голосов
/ 19 августа 2009

И если вы читаете из Exchange, используя поток, не забудьте правильно завершить поток, позволив процедуре потока завершиться.

Обычно это достигается с помощью логической переменной, доступной вашему потоку, проверьте эту переменную и выйдите из функции потока.

0 голосов
/ 19 августа 2009

Остановить приложение навсегда? Закройте основную форму:

  Private Sub mnuFileExit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles mnuFileExit.Click
     Me.Close()
  End Sub

Остановить это временно на несколько минут? Используйте таймер.

...