2013-11-14 3 views
-2

나는이 질문을 편집하려고 : What's the preferred way of exiting a command line program?선호하는 방법 2 부

을하지만 내 편집이 거부되었습니다. 나는 논평 할 수 없으므로 질문을 복제 할 위험이 있습니다.

원래 질문은 "명령 줄 프로그램을 종료하는 가장 좋은 방법은 무엇입니까"입니다. 가장 좋은 방법은 분명히 return에서 Main()까지이지만, Console.CancelKeyPress 또는 타이머와 같은 이벤트 처리기를 종료하려면 어떻게해야합니까?

이벤트 처리기의 Environment.Exit() 메서드와 같이 Main()에서 "멀리"벗어나는 유일한 방법은 무엇입니까? Environment.Exit()은 정리하지 않기 때문에 안전하지 않을 수 있습니다.

예제 코드 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     Timer t = new Timer(4000); 
     t.Elapsed += t_Elapsed; 
     t.Start(); 

     while (true) 
     { 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 

    static void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     // I want to exit here 
    } 
} 
+0

이 질문은 새로운 질문이기 때문에 사람들이 업데이트를 보지 않을 것 같지 않은 오래된 질문으로 편집해서는 안됩니다. – Magus

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –

+0

종료 코드가 실제로 중요하고 누군가 실제로 사용하려고하면 'Environment.Exit()'를 사용하거나 Main()을 업데이트하여 int (상태 코드 값) 값을 반환해야합니다 OS로 돌아가고 싶다). 그래서 정말로, 그것은 달려 있습니다. –

답변

1

프로그램을 제공하는 것은 단일 스레드, 당신은 사용자 정의 예외를 발생하고, Main() 방법보다 그것을 더 네르를 잡을 수 없습니다. 이렇게하면 정상 종료를 달성하기 위해 정리를 수행 할 수있는 많은 기회가 제공됩니다 (예 : finally 블록). 이 같은 프로그램 인 경우

public class ExitProgramException : Exception { } 

public void SomeNestedStuff() 
{ 
    ... 
    if (...) throw new ExitProgramException(); 
    ... 
} 

public void Main() 
{ 
    try 
    { 
     ... 
     SomeNestedStuff(); 
     ... 
    } 
    catch (ExitProgramException) 
    { 
     Console.WriteLine("Bye!"); 
    } 
} 

그러나, 멀티 스레드, 당신은 당신의 비즈니스 로직의 특성에 따라, 좀 더 복잡한 우아한 출구 메커니즘을 구현해야합니다.

+0

하지만 다시 이벤트 처리기에서는 작동하지 않습니다. 맞습니까? 이벤트 처리기에서 예외를 throw하고 Main()에서 catch 할 수는 없습니까? –

+0

'Console.CancelKeyPress'의 핸들러는 쓰레드 풀 쓰레드에서 실행됩니다. 응용 프로그램을 중단하기위한 자체 메커니즘을 따르도록 설계되었습니다. 설명서를 읽어야합니다. http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress(v=vs.110).aspx –

+0

즉, 질문에 답변이 없음을 의미합니다. –