2009-03-30 5 views
11

나는 특정 시간에 지속적으로 실행하고 작업을 수행하는 데 필요한 콘솔 응용 프로그램을 개발하려고합니다.C# 콘솔 응용 프로그램 - 계속 실행하십시오.

제 질문은 응용 프로그램을 안전하게 유지하는 데 가장 좋은 방법이나 관행은 무엇입니까?

제 생각에는 결코 끝나지 않는 루프? 잠자기 후 필요할 때 루틴으로 점프하는 타이머 (잠자기 시간 설정 후)?

응용 프로그램을 exe 파일로 컴파일 한 다음 AlwaysUp을 사용하여 서비스로 실행합니다.

감사합니다 ..

피터

+0

여러 가지 종류의 답변이있는 이유는이 일이하는 일에 대해 많은 정보를 제공하지 않았기 때문입니다. 더 많은 정보를 통해 지금까지 제시된 옵션 중 일부를 좁힐 수 있습니다. – Cheeso

답변

8

왜 당신이 첫번째 장소에있는 서비스로 응용 프로그램을 구축하지?

+0

WIndows는 서비스를 사용해야합니다. 누가 가장 좋은 모델인지 모릅니다. – ojblass

2

지속적으로 실행되는 코드는 데몬이라고하며, 묻는대로 수행하는 방법을 간략하게 설명하는 문서 here이 있습니다. 간단한 서비스를 작성하는 방법의 예를 알려 드리겠습니다. here.

+0

예. 서비스를 고려해 보았지만 파일을 처리하고 저장된 파일의 구성 정보를 읽어야 구성 파일에 지정된 특정 시간에 작업 할 수 있으므로 내 요구 사항을 충족시키지 못할 것이라고 생각합니다. –

3

아마 불필요하게 프로세서 시간을 소비하는 루프를 돌리고 싶지 않을 것입니다.

Windows에 있다고 가정하면 필요에 따라 WaitForSingleObject() 또는 WaitForMultipleObjects() 또는 MsgWaitForMultipleObjects() 호출로 끝나지 않는 루프가 있어야합니다. 그런 다음 이름이 지정된 이벤트와 같이 당신을 깨우는 동기화 객체가 있어야합니다.

Win32 동기화 설명서 here을 참조하십시오. 프로그램에서해야 할 일에 대해 더 자세히 설명해 주면보다 구체적인 조언을 제공 할 수 있습니다.

+0

안녕하세요, 업데이트 해 주셔서 감사합니다. 콘솔 응용 프로그램으로 선택한 이유는 언제든지 수동으로 실행할 수있는 옵션을 제공한다는 것입니다. 응용 프로그램은 구성 파일을 읽고 해당 구성 파일에 저장된 정보에서 주어진 시간에 파일 읽기/프로세스를 실행합니다. –

+0

또한 certian 디렉토리에 파일이없는 경우 경고 전자 메일을 보내야합니다. 파일이 존재하면 열고 열어야 오류를 찾고 오류가 있으면 경고 전자 메일도 보내야합니다. –

1

글쎄 확실한 점은 멈춰야한다는 것입니다.

콘솔 앱으로도 실행 가능하게하려면 작동하는 스레드를 생성하고 Console.ReadLine()에는 메인 스레드 블록을 생성하십시오.

주 스레드를 영원히 일시 중지하려면 실행하지 않는 ManualResetEvent를 차단하십시오.

하지만 가능한 경우 서비스 사용을 고려해보십시오.

2

프로그램이 계속 실행되는 경우 원하는 이벤트가 발생할 때까지 (예 : XX 초 경과) 잠자기해야합니다. while() 루프를 돌리면 CPU 시간을 빨아 들일 것입니다.

프로그램이 항상 컴퓨터에서 실행될 예정이면 서비스를 자동으로 시작하고 중지 할 수 있도록 서비스를 만드는 것을 고려해야합니다.

13

더 나은 솔루션은 작업을 수행하고 종료되는 콘솔 응용 프로그램을 작성하는 것입니다. 그런 다음 Windows 작업 스케줄러를 사용하여 주기적으로 실행할 수 있습니다.

+2

절대적으로 동의! Jon Galloway는 잠시 뒤로 블로그 게시물을 작성하여 작업 대신 서비스를 만들어 잘못했다고 생각했습니다. http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

나는 서비스가 사용자 자격 증명 측면에서 더 많은 유연성을 제공한다고 생각합니다. – ojblass

+0

최소한 내가 본 것만 큼 예약 된 작업이 실행될 자격 증명을 설정할 수 있습니다. 업무로는 할 수없는 서비스로 무엇을 할 수 있습니까? –

1

데스크톱 응용 프로그램을 구축하는 경우 시스템 트레이에서 실행하고 싶을 것입니다.이 실수는 당신이 Windows 서비스를 작성하고자하는 서버 응용 프로그램을 만드는 경우

  • 을 사용자의 화면을 어지럽히고에서 응용 프로그램을 유지 응용 프로그램을 닫는에서 사용자를

    1. 을 유지합니다. 이

      1. 누가 주로 사람으로

      에서 실행되는 실수로 응용 프로그램

    2. 사람이 귀하의 응용 프로그램에 대한 콘솔에 로그인해야하는 서버에 대한 필요성을 제거를 닫는 관리자를 유지합니다 IT 전문가는 Windows 응용 프로그램 대신 콘솔 응용 프로그램으로 실행되는 타사 응용 프로그램을 구입할 때 많은 노력을 기울였습니다. 그것은 우리를 위해 많은 일을 만들어 내고 중요한 지원 문제와 보안 허점을 열어줍니다.

    1

    잠자기 상태로 스레드 보내기 : System.Threading.Thread.Sleep (10000);

    키를 누르기를 기다리는 중 : Console.WriteLine ("계속하려면 아무 키나 누르십시오 ..."); Console.Read();

    +0

    스레드 수면은 소프트웨어를 더 느리게 할당하므로 사용하지 않아야합니다. 콘솔 앱에 AutoResetSignal을 사용하거나 전체 시간 동안 실행해야하는 경우 서비스를 만들어야합니다. – ppumkin

    3

    System.Windows.Forms에 대한 참조를 추가하고 System.Windows.Forms.Application.Run()을 호출하여 표준 응용 프로그램 메시지 루프를 시작할 수 있습니다. Ctrl-C은 앱을 종료합니다.

    또 다른 옵션은 Console.ReadKey()을 사용하여 앱을 일시 중지하는 것입니다. Like Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

    내 콘솔 앱에서 이벤트가 발생하기를 기다리고있을 때 사용합니다. 두 경우 모두 앱이 계속 실행되고 타이머, WCF, FileWatcher 등의 트리거 된 이벤트를 잡습니다.

    2

    당신이 /가 필요 어쨌든이 작업을 수행하려는 경우 당신이 정말로, 이것에 대한 서비스를 이용해야하지만,이 작업을 수행하기 위해 ManualResetEvent를 사용할 수 있습니다이 완료되면 '시작'과

    private ManualResetEvent Wait = new ManualResetEvent(false); 
    

    그냥 기다려 싶어, 당신이 다음 할 거라고 :

    Wait.WaitOne(); 
    

    을 중지하고 종료하도록하려는 경우, 당신은 할 수 있습니다 :

    Wait.Set(); 
    
    관련 문제