2013-04-29 5 views
4

App.Current.Shutdown()은 비동기 적으로 작동합니다. 즉,이 메서드를 호출하면 Shutdown() 호출에 이어지는 코드 줄 실행으로부터 보호되지 않습니다.WPF 응용 프로그램을 동기식으로 종료하는 방법은 무엇입니까?

그래서 App.Current.Shutdown()이 호출 된 스레드를 차단하는 방법은 무엇입니까?

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     App.Current.Shutdown(); 

     File.WriteAllText(@"..\log.txt", "Info");  
    } 
} 

private void App_OnExit(object sender, ExitEventArgs e) { 
     Thread.Sleep(3500); 
    } 

File.WriteAll은 새 파일을 만들고 "Info"문자열을 작성합니다.

+1

'Shutdown' 메서드는 항상 Main Thread에서 호출되어야합니다. 그리고'Shutdown'은 메인 스레드를 멈춰야한다고 생각합니다. 다른 행동을하고 있습니까? 코드를 보여 주시고, 무엇을 성취하려고하십니까? – outcoldman

답변

4

App.Current.Shutdown()이 문서에 따라 비동기 적으로 작동하지 않는 경우를 위해 잘 작동합니다 : http://msdn.microsoft.com/en-us/library/ms597013.aspx

Application.Current.Dispatcher.BeginInvokeShutdown() 작동 비동기입니다.

UPD는

난 당신의 코드를 테스트했습니다. 당신 말이 맞아요. App.Current.Shutdown()에 관한 문서는 오도 된 것입니다. 현재 메소드에서 App.Current.Shutdown() 이후의 코드가 실행됩니다. 따라서 App.Current.Shutdown은 반환 전 마지막 문이어야하며 메서드 호출 트리도 준수해야합니다.

Environment.Exit(0)으로 전화를 걸지 만 트릭과 해킹으로 간주 될 수 있습니다. 왜냐하면 사실상 정상적으로 처리 할 수 ​​없거나 정상적으로 처리 할 수 ​​없기 때문입니다.

+1

내 질문을 편집했습니다. 파일에 쓰기를 시도하고 App.Shutdown이 매우 이상하게 작동한다고 스스로에게 확신 시키십시오. – EngineerSpock

+0

@EngineerSpock 답변을 업데이트했습니다. 당신은 맞습니다 – Regfor

+0

@EngineerSpock Amyway 그것이 힘든 이유를 찾아내는 것은 어렵습니다. 반사경조차도 도움이되지 않습니다. 비슷한 http://stackoverflow.com/questions/6601875/application-current-shutdown-1-not-closing-wpf-app – Regfor

0

간단한 WPF 응용 프로그램을 만들고 코드를 복제했습니다. 종료가 비동기 적으로 작동하지 않습니다. 닫기 버튼을 클릭하면 응용 프로그램이 즉시 종료되었습니다. 다른

<Grid> 
    <Button x:Name="btnClose" Height="50" Width="100" Click="btnClose_Click_1" Margin="265,135,152,135">Close</Button> 
</Grid>**strong text** 

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.Loaded += MainWindow_Loaded; 
     } 

     void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 

     private void btnClose_Click_1(object sender, RoutedEventArgs e) 
     { 
      Application.Current.Shutdown(); 

      MessageBox.Show("test"); 
     } 

     private void App_OnExit(object sender, ExitEventArgs e) 
     { 
      Thread.Sleep(3500); 
     } 
    } 
} 

그런 다음 Process.GetCurrentProcess() 죽여()를 사용하여 프로세스를 종료 할 수 있습니다.;

은 System.Diagnostics 네임 스페이스를 사용합니다. 이것은

+0

예, 알고 있습니다. 그러나 파일에 뭔가 쓸 것을 권합니다. 앱 종료 후 Windows가 새로운보기를 열지 못하게 할 수 있기 때문입니다. – EngineerSpock

+0

Write File.WriteAllText (@ ".. \ log.txt", "Info"); 대신 MessageBox.Show ("test"); – EngineerSpock

+0

그런 다음 Process.GetCurrentProcess()를 사용하여 프로세스를 종료 할 수 있습니다. System.Diagnostics 네임 스페이스를 사용하십시오. 이것은 당신을 위해 잘 작동합니다 –

관련 문제