배경 :VB.NET - 프로그램 종료 후 콘솔 프로세스가 열려 있습니다. 올바르게 닫으려면 어떻게해야합니까?
대화 형 콘솔 응용 프로그램을 열고 STDOUT/STDERR을 수신하고이 대화 형 세션에 명령을 보내는 프로그램을 작성하고 있습니다. 결국 그것은 exit 명령을 내고 프로세스는 정상적으로 사라집니다. 사용자가 닫기 버튼을 클릭하면 exit 명령을 내리는 클래스에서 처리를 호출 한 다음 프로그램이 종료되기 전에 강제로 세션을 닫으려고 시도합니다. 나는 테스트 당일에 고아가 된 프로세스가 계속 실행되고 있음을 알았습니다. 그들은 쌓아 올리지도 않고 끊이지 않습니다. 분명히, 나는 끔찍한 실수를 범했습니다.
질문 : 내 콘솔 프로세스 내 응용 프로그램이 종료되기 전에 완전히 죽은 것을 확인하려면 어떻게
?
MY Dispose 메서드 :Protected Overridable Async Sub Dispose(disposing As Boolean)
If _disposed Then Return
If disposing Then
_handle.Dispose()
' Free any other managed objects here.
'
If IsConnected Then Await ClosePort().ConfigureAwait(False)
If _transmissionCancel IsNot Nothing Then _transmissionCancel.Dispose()
End If
' Free any unmanaged objects here.
'
If _consoleReader IsNot Nothing Then _consoleReader.Dispose()
If _consoleWriter IsNot Nothing Then _consoleWriter.Dispose()
If _consoleProcess IsNot Nothing Then _consoleProcess.Dispose()
_disposed = True
End Sub
참고 : 여기라는 "ClosePort"방법은 살인 및 대기 기능 :
If Not _consoleProcess.WaitForExit(SocketTimeout) Then
_consoleProcess.Kill()
_consoleProcess.WaitForExit()
End If
Dispose() 비동기는 좋은 결과를 가져 오지 않을 것입니다. 이 프로그램은 거의 비동기 코드가 완료 될 정도로 오래 실행되지 않습니다. –
불행하게도 나는 비동기식으로 프로세스에 exit 신호를 보내고있다. 이것은 콘솔 프로세스가 자신의 용어로 종료하도록 허용됩니다. 죽이는 것은 실패한 경우에만 해당됩니다. – HackSlash
비동기 키워드 추가는 프로그래머가 간단한 비동기 문제를 해결하는 방법을 모르는 불행한 부작용을 초래했습니다. 스레드를 시작하고 IsBackground 속성이 False가 아닌지 확인하십시오. –