2017-10-05 12 views
0

배경 :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 
+1

Dispose() 비동기는 좋은 결과를 가져 오지 않을 것입니다. 이 프로그램은 거의 비동기 코드가 완료 될 정도로 오래 실행되지 않습니다. –

+0

불행하게도 나는 비동기식으로 프로세스에 exit 신호를 보내고있다. 이것은 콘솔 프로세스가 자신의 용어로 종료하도록 허용됩니다. 죽이는 것은 실패한 경우에만 해당됩니다. – HackSlash

+0

비동기 키워드 추가는 프로그래머가 간단한 비동기 문제를 해결하는 방법을 모르는 불행한 부작용을 초래했습니다. 스레드를 시작하고 IsBackground 속성이 False가 아닌지 확인하십시오. –

답변

0

@ 한스 - 옆모습에서 제안 온; 내 Dispose 메서드에서 "Async"한정자를 제거하고 처리를 완료하기 전에 작업이 완료 될 때까지 동 기적으로 대기합니다. 나는 내 기능을 수행하고 시작하라고했다. 이 작동하는 것으로 나타나지만 지금은 닫기 단추를 클릭하면 내 프로그램이 끝나지 않습니다. 내 코드가 ".start"에서 "End Using"로 점프하지만 Dispose 메서드가 중지되고 컨트롤이 다시 UI로 전달됩니다. 두 번째 시간을 닫으면 다시 dispose 메서드가 실행되고 프로그램이 정상적으로 종료됩니다.

나는 원래의 문제를 해결 한 것으로 보이고 나의 현재 대답이기 때문에 대답으로 올린다. 그러나 프로그램을 끝내려면 두 번 닫아야하기 때문에 솔루션으로 표시하고 싶지 않습니다. 내가 무슨 짓을 한?

다른 솔루션을 사용할 수 있습니다.

Protected Overridable Sub Dispose(disposing As Boolean) 
    If _disposed Then Return 

    If disposing Then 
     _handle.Dispose() 
     ' Free any other managed objects here. 
     '   
     If IsConnected Then     
      Using holdOnAMinute As Task = Task.Run(Function() ClosePort())     
       holdOnAMinute.Start() 
       holdOnAMinute.Wait(SocketTimeout) 
      End Using 
     End If 
    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() 
    If _transmissionCancel IsNot Nothing Then _transmissionCancel.Dispose() 

    _disposed = True 
End Sub