2012-09-26 7 views
6

Wpadłem dzisiaj na ten problem i zajęło mi to sporo czasu. Zaczynałem proces od IIS, przekierowując jego standardowe wyjście i wyjście błędów, więc kiedy proces zakończył, byłbym w stanie wygenerować z nim log. Wszystko działało dobrze na mojej maszynie, ale nie tak dobrze po tym, jak ją opublikowałem.Rozpoczęty proces zawiesza się, gdy przekierowane dane wyjściowe są względnie duże.

Proces miał działać przez chwilę, a następnie zakończyć, ale po prostu nie. Po prostu przestałby reagować, utrzymując zasoby takie jak gniazda. Po pewnym czasie udało mi się zidentyfikować przyczynę problemu: wygenerowany dziennik był zbyt duży. Po komentowaniu Console.WriteLine z uruchomionego procesu wszystko działało dobrze.

Tylko dla wyjaśnienia jak zacząłem proces:

Process process = new Process(); 
process.StartInfo.FileName = path; 
process.StartInfo.Arguments = arguments; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.EnableRaisingEvents = true; 
process.Exited += Process_Exited; 
process.Start(); 

I jak ja obsługiwane jest wyjście:

private static void Process_Exited(object sender, EventArgs e) 
{ 
    Process process = (Process)sender; 
    File.WriteAllText(path, process.StandardOutput.ReadToEnd() + 
    "\r\nEXCEPTIONS\r\n" + process.StandardError.ReadToEnd()); 
} 

Chociaż już wiem jak to naprawić, to wciąż lubią wiedzieć, co się naprawdę wydarzyło i dlaczego, ponieważ musi istnieć sposób, aby utworzyć dziennik tak duży, jak bym chciał.

Odpowiedz

7

documentation for RedirectStandardOutput nie opisuje jeden, ale dwa możliwe scenariusze impasu (jak to jest dla biblioteki użyteczne i nie są niebezpieczne klasy ?!)

Jeden występuje, gdy zarówno StandardOutput i StandardError są zarówno przekierowany, a gdy istota strumień czytanie jest pełne. Wydaje się to doskonale odzwierciedlać twoją sytuację.

Dość irytująca sytuacja, ale przeczytaj pełną dokumentację i opisz, jak jej uniknąć.

+2

Wierzę, że to było rzeczywiście to, co się stało! I odpowiedź była w dokumentacji, wstyd mi. Dziękuję za odpowiedź! –

Powiązane problemy