2017-09-05 13 views
1

두 프로그램이 서로 충돌합니다. 그 중 하나는 한밤중에 Task Scheduler (Program1)에 의해 시작되는 C# 콘솔 응용 프로그램이며 다른 하나 (Program2)는 일반적으로 하루 동안 사용자가 실행하는 C# WPF 프로그램입니다. 나는 프로그램 1에서이 program2를 종료하려면 다음을 사용하려고 : 프로그램 1은 TaskScheduler에서 실행될 때TaskScheduler에서 실행할 때 찾기/닫기 프로세스는 어떻게됩니까?

어떤 이유
public static void CloseProgram2() 
{ 
    var process = System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(); 
    if (process != null) 
    { 
     if (process.CloseMainWindow()) 
     { 
      SpinWait.SpinUntil(() => null == System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(), 
       TimeSpan.FromSeconds(30)); 
     } 
    } 
} 

, program2에 종료되지 않습니다. 그러나 Program1을 수동으로 실행하면 항상 Program2가 종료됩니다. 누군가 컴퓨터에 로그인되어 있는지 여부와 상관없이 Program1이 실행되도록 작업 스케줄러에서 자격 증명을 제공하도록 설정했습니다. 작업 스케줄러에서 실행 중일 때 Program1의 출력 창이 표시되지 않지만 성공적으로 실행됩니다. 아마도 Task Scheduler가 Task Scheduler에서 시작하지 않은 프로세스를 볼 수 없도록 Program1을 실행하고 있는지, 그리고 Program2가 종료되지 않은 이유가 궁금합니다.

Program1이 TaskScheduler를 사용하여 실행될 때 Program2를 닫을 수있는 아이디어 나 솔루션은 크게 감사하겠습니다.

+0

안정적으로 문제를 재연하는 좋은 [mcve] 없이는 질문에 대답 할 수 없습니다. 여기에는 작업 스케줄러 작업이 설정되는 방법에 대한 _exact_ 세부 정보가 포함됩니다 (작업을 설치하는 _code_가 바람직 함). 그러나이 문제는 콘솔 프로그램이 실행되는 사용자 계정과 관련이 있으며 프로그램이 처리 및/또는 종료 할 수있는 프로세스와 관련이있는 것으로 거의 확실합니다. –

+0

콘솔과 WPF 프로그램 모두에 로깅을 추가하여 각각이 자신의 작업과 관련된 것들 (반환되는 프로세스, 'WM_CLOSE'메시지 수신 여부 등)을보고 할 수 있도록하면이 문제를보다 효과적으로 디버깅 할 수 있습니다. –

답변

0

사용할 다른 솔루션을 찾았습니다. 대신 proccess.CloseMainWindow를 사용하는() 나는 다음과 같은 배치 파일 생성 :

taskkill /F /IM Program2.exe 

을 그리고 단지 작업 스케줄러에서 해당 배치 파일을 실행했습니다.

이상한 점은 내 bat 파일에서 taskkill 명령 앞에 빈 줄을 넣어야한다는 것입니다. 그것 없이는, 나는 횡설수설의 무리를 얻는다. 그리고 그것은 그 명령을 달리게하는 방법을 모르고있다. 거의 마치 쓰레기가 taskkill 명령 앞에 삽입 된 것처럼 보입니다. 매우 이상한 ...