2010-12-11 3 views
2

호출 프로세스가 종료 된 경우에도 자체적으로 정리할 새 프로세스를 만들고 싶습니다. 메모장을 사용하여 임시 파일을 표시하는 예제를 조롱했습니다. 메모장을 닫은 후에 삭제하고 싶습니다.그 자체 후에 항상 정리할 프로세스를 생성 할 수 있습니까?

아래 코드에서 WaitForExit() 줄의 주석을 제거하거나 실행중인 호출 프로그램을 모방하는 무한 루프로 이동하면 예상대로 작동합니다. 주요 문제는 이벤트가 더 이상 처리되지 않기 때문에 호출 프로그램이 완료 될 때입니다.

이 사례를 처리하는 방법에 대한 제안을 보내 주시면 감사하겠습니다.

감사합니다,

크리스

static void Main(string[] args) 
    { 
     string filename = @"c:\temp\example.txt"; 
     if (!File.Exists(filename)) 
      File.WriteAllText(filename, "abc"); 

     ProcessStartInfo psi = new ProcessStartInfo("notepad", filename); 

     Process cmdProcess = new Process(); 

     Process p = new Process(); 
     psi.CreateNoWindow = true; 
     p.EnableRaisingEvents = true; 
     p.StartInfo = psi; 
     p.Exited += (sender, e) => { File.Delete(filename); }; 

     p.Start(); 
     //p.WaitForExit(); 
    } 
+0

그 이유 ** 당신이 마지막 줄을 주석 않았다 ** 이해하지 않습니다. 나는 그것이 발신자 스레드 (즉, 프로그램)를 차단한다는 것을 알고 있지만 정확하게 ** ** 당신이 원하는 것일 수도있다 ** –

+0

나는 호출자 스레드 (내 프로그램)가 그 이후의 삶을 계속 수행하고 싶다. 완전히 하위 프로세스와 독립적이다. . – cristobalito

답변

3

교활한 방법.

근무 샘플 (: \ TEST.BAT C로 저장) :

echo FOO > c:\test.txt 
notepad c:\test.txt 
del c:\test.txt 
del c:\test.bat 
+0

감사합니다 liho1eye - 그게 현재의 솔루션이지만, 그것은 특정 우아함이 부족합니다 :) – cristobalito

+0

당신은 본질적으로 똑같은 세 번째 "모니터"프로세스를 만들 수 있습니다. 그렇다면 당신의 솔루션은 순전히 C# 일 것입니다. 그러나 약간의 코드와 추가 프로젝트/실행 파일의 복잡성이 있습니다. 요점은 누군가가 그것을해야한다는 것입니다 (정리 작업을 수행하십시오). 메모장을 제어 할 권한이 없으므로 메모장에서이를 수행 할 수 없습니다. –

+0

나는 아직도이 답변의 해키움에 조금 실망하고 있지만 상황을 고려할 때 수행 할 수있는 최선일 것입니다. 귀하의 제안에 감사드립니다. – cristobalito

2

호출 프로세스가 더 이상 아무것도 할 수 종료되지 않은 경우; 그것은 존재하지 않습니다.

하나의 옵션은 이 아니고이 아닌 배경 스레드 (IsBackground을 false로 설정)이며 해당 스레드에서 WaitForExit를 호출하는 것입니다. Main에서 정상적으로 종료하는 동안 프로세스가 유지됩니다. 그러나 프로세스가 비정상적으로 종료되면 (작업 관리자 을 삭제하거나 단순히 전원을 끄는 경우)이 작업을 수행 할 수 없습니다.

+0

Marc에게 감사드립니다. 조사하겠습니다. 비정상적인 종료에 관해서는, 그게 내가 살 수있는 것입니다. – cristobalito

+0

문제는 호출 프로그램이 작성한 프로세스가 끝날 때까지 호출 프로그램을 완료 할 수 없다는 것입니다. 새 프로세스가 자체적으로이 정리 작업을 수행 할 수있는 방법이 있습니까? – cristobalito

0

특히 파일의 경우 Win32 FileCreate를 사용하여 FILE_FLAG_DELETE_ON_CLOSE - http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx 으로 조사 할 수 있습니다. 또한 .Net Framework에 기존 지원이 있다고 생각하지 않습니다. 프로세스 대신 일괄 처리를 실행해야 다음

notepad c:\temp\example.txt 
del c:\temp\example.txt 

과 : 약이 작업을 수행하는 배치 파일을 작성하는 것입니다

+0

감사합니다. Alexei - "부모"프로세스가 파일을 생성하고 "자식"프로세스가 완료되면 삭제할 수 있습니다. – cristobalito

관련 문제