2010-08-14 4 views
0

올바른 명령 줄 인수가 전달되지 않을 때 UI를 표시하는 프로젝트가 있습니다. 그것은 바탕 화면 배경 화면을 동적으로 업데이 트하기 위해 만들어진 간단한 유틸리티입니다. 업데이트가 완료되면Application.Run이 완료되기 전에 .NET 응용 프로그램을 삭제하십시오.

this.Dispose(); 

으로 전화를 걸지만 명령 줄 인수가 전달되면 문제가 발생합니다. 이 폼은 실제로 사용자에게 표시되기 전에 Dispose 메서드 호출을 얻습니다. 그 결과, 필자가 원했던 것처럼 프로그램이 제대로 작동하지 않는다는 불쾌한 오류가 발생합니다.

나는이 점에 대해 매우 논리적이지 않다는 것을 존중할 수 있지만 해결책을 찾기위한 다른 방법은 없습니다. 응용 프로그램이 오류를 일으키지 않고로드되기 전에 Dispose() 메서드를 깨끗하게 호출하는 다른 방법이 있습니까?

추가 정보 :

은 위의 evidentially 명확하지 않다 나는 그 드려 죄송합니다. 내 프로그램은 Program.cs 파일에서 시작됩니다 : 생성자에서

Application.Run(new MainForm()); 

나는 명령 줄 인수가 존재하는지 확인하고 너무 SilentRun라는 루틴을 호출합니다. 이 private 메서드는 인수가 유효한지 확인한 다음 인수가 BrandSystem()이라는 작업을 커밋하기위한 메서드에 전달하는지 확인합니다.

BrandSystem 후

는() 할 실제로 할 수있는 응용 프로그램에 대해 다른 아무것도 없기 때문에 그 일에, 마지막 문장은

this.Dispose(); 

입니다 완료됩니다. 명령 인수가 전달되지 않고 사용자가 GUI를 사용하여 변경 사항을 적용하면이 동일한 메소드가 호출됩니다. 기본적으로 벽지를 업데이트하는 프로세스가 완료되면 응용 프로그램이 종료되기를 원합니다.

명령 줄 인수의 이유는이 정렬 유틸리티를 설치 패키지에 추가하고 백그라운드에서 자동으로 실행할 수 있기 때문입니다. 설치 과정에 바탕 화면을 업데이트 할 수있는 기본 기능이 없으며이 기능은 나를위한 두 가지 새 기능입니다.

프로그램이 명령 줄 모드에서 실행되고 모든 것이 실제로로드되기 전에 Dispose를 호출하면 문제가 발생합니다. 내 논리가 완전히 불건전하다는 것을 증명하더라도 제안에 대해서는 개방적입니다.

+0

매우 명확하지 않다면 스 니펫은 쓸모가 없습니다. 어쨌든 프로그램이 종료 될 때 무엇을 처분해야합니까? –

+0

@ 한자 Passant - 설명을 위해 업데이트를 참조하십시오. 내가 너무 애매하다는 것을 지적 해 주셔서 감사합니다. – Jeff

+0

방금 ​​* 모든 * 프로그램에있는 코드 스 니펫을 추가했습니다. –

답변

1

모든 코드를 볼 수는 없지만 자동 모드로 실행 중일 때 프로그램에서 Application.Run으로 전화해야하는 이유가 있습니까? GUI 시작을 제거하면, GUI를 삭제하는 것에 대해 걱정할 필요가 없습니다. 여기

내가 그것을 할 수있는 방법은 다음과 같습니다

물론
// In main method 

if (runningInSilentMode) 
{ 
    // Run the app in silent mode 
    // Do core behavior based on arguments, don't call Application.Run 
} 
else 
{ 
    // Run the app in interactive mode 
    // Do core behavior based on the user's input 
    Application.Run(new MainForm()); 
} 

,이 핵심 프로그램 로직이 당신의 GUI와 통합되지 않는 것으로 가정합니다. GUI와 통합되어 있다면 GUI를 분리하기 위해 리팩터링을해야 할 것입니다.

+0

여기 코드를 위반했다고 생각합니다! 물론 대답은 SilentInstall() 메서드를 GUI가 아닌 외부 클래스로 이동하고 명령 줄 인수 검사를 Program.cs 파일로 이동하는 것입니다. 감사. 나는 이것이 이마에 때리는 때가 될 것이라는 것을 알았고, 여기, 나는 이마에 자신을 때리고있다. 감사! – Jeff

1

플래그를 지정하지 않고로드 될 때까지 기다렸다가 응용 프로그램을 종료하는 이유는 무엇입니까? Dispose는 특정 작업을위한 것입니다. 관리되지 않는 개체에서 리소스 재생.

+0

신고 하시겠습니까? – Jeff

+0

부울을 설정하고 세션을 저장하십시오. 응용 프로그램을 종료해야한다는 사실을 '저장'한 다음 해당 정보를 사용하여 적절한 시간에 종료할지 여부를 결정하십시오. – Rushyo