2009-06-29 10 views
1

C#에서 대체 Windows 셸을 작성하고 있으며 현재 구현중인 기능은 동일한 셸 창 내부에 모든 IO가 있습니다. 즉, 다른 창에서 cmd.exe를 열지 마십시오.C# 셸 - IO 리디렉션

지금은 출력 할 부분 솔루션이 있습니다. 이것은 (p는 실행중인 프로세스입니다) 내 코드입니다 :

while (!p.HasExited) { 
    /* ... - irrelevant */ 
    if (redirect) { 
     try { 
      p.BeginOutputReadLine(); 
     } catch { } 
    } 
} 

과정은 모든 올바른 속성 설정, = False 같은 UseShellExecute, RedirectStandard{Input, Output, Error} = True, 이벤트 핸들러가 올바르게 설정, 하지만 일관성이 없습니다.

나는 try/catch (나는 매우 나쁜 습관이다)를 시도해 보았고 핸들러가 실행될 때 false로 설정된 busy bool을 사용했지만 어떤 이유로 든 여전히 InvalidOperationException을 얻는다. p.BeginOutputReadLine() - 이미 비동기 작업이 실행 중임을 나타냅니다.

위에서 언급 한 것과 완전히 다른 해결책이 필요한 경우에도 도움이 될 것입니다.

감사합니다.

편집 : 또한

if (redirect) 
{ 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.RedirectStandardError = true; 
    p.StartInfo.RedirectStandardInput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.OutputDataReceived += new DataReceivedEventHandler(redirectHandler_StdOut); 
    p.ErrorDataReceived += new DataReceivedEventHandler(redirectHandler_StdErr); 
} 
p.Start(); 

, 나는 내가 일관성이 무슨 뜻인지 설명하고 있지 않다 것을 깨달았다 다음은 프로세스를 시작하는 코드입니다. 일반적으로 비동기 적으로 실행 시작하기로 시작

screenshot

+0

프로세스를 시작하는 코드는 어떤 모양입니까? –

+0

나는 단지 지금 질문을 업데이트 할 것이다. –

답변

3

방법 : 그들이 말하는 것처럼, 그림 2^3 단어 가치가있다. 이게 니가 원하는거야? 루프가 가능한 한 빨리 실행되기 때문에 BeginOutputReadLine이 점점 더 많이 호출됩니다 (호출이 즉시 완료되기 전에 완료되고 루프가 다른 반복을 위해 돌아 오기 때문에).

동기식 솔루션의 경우 StandardOutput 스트림에서 ReadLine을 호출 할 수 있습니다. 또는 :

while (!p.HasExited) { 
     /* ... - irrelevant */ 
     if (redirect && !busy) { 
      try { 
       busy = true; 
       p.BeginOutputReadLine(); 
      } catch { } 
     } 
    } 
    ////In the method that gets called upon completion of BeginOutputReadLine 
    busy = false; 

이 (MSDN에서)하지만이 점을 염두에 두십시오 :

비동기 작업을 시작을 읽을

, 이벤트 핸들러마다 관련 프로세스 라고하는 것은의 라인을 기록 텍스트를 표준 출력 스트림으로 보냅니다.

CancelOutputRead를 호출하여 비동기 읽기 작업을 취소 할 수 있습니다. 읽기 작업은 호출자 또는 이벤트 처리기로 취소 할 수 있습니다. 취소 후 BeginOutputReadLine을 다시 호출하여 비동기 읽기 작업을 다시 시작할 수 있습니다.

이렇게하면이 메서드를 한 번만 호출하면됩니다. 그러면이 메서드는 한 줄만 쓰면 콜백을 통해 계속 알려줍니다.

+0

나는 이것이 또한 문제라고 생각한다; 그것은 단지 나에게 발생했지만, 당신은 이미 나를 위해 그것을 썼다 : –

+0

그게 내가 try ... catch를 제외하고, 내가 시도한 것을 제외하고 - 나는 그것을 추가 할 것이다. MSDN은 BeginOutputReadLine 일단? 또는 모든 라인이 끝나면 다시 시작해야합니까? –

+0

(이 질문에 해당하지 않음, 죄송합니다!) 인터넷에 무엇이 있는지 기억하지 않아도됩니다. –

관련 문제