diff --git a/src/ScriptEngine.HostedScript/Library/ProcessContext.cs b/src/ScriptEngine.HostedScript/Library/ProcessContext.cs index 73238ce4c..8c5ede759 100644 --- a/src/ScriptEngine.HostedScript/Library/ProcessContext.cs +++ b/src/ScriptEngine.HostedScript/Library/ProcessContext.cs @@ -120,11 +120,11 @@ public void Start() /// /// /// Пример правильной обработки цикла ожидания завершения процесса: - /// Процесс не завершается, пока любоой из потоков (stdout, stderr) открыт для чтения. + /// Процесс не завершается, пока любой из потоков (stdout, stderr) открыт для чтения. /// Процесс висит и ждет, пока его освободят от текста в обоих потоках. /// /// Пока НЕ Процесс.Завершен ИЛИ Процесс.ПотокВывода.ЕстьДанные ИЛИ Процесс.ПотокОшибок.ЕстьДанные Цикл - /// Если ПериодОпросаВМиллисекундах <> 0 Тогда + /// Если ПериодОпросаВМиллисекундах <> 0 Тогда /// Приостановить(ПериодОпросаВМиллисекундах); /// КонецЕсли; /// diff --git a/src/ScriptEngine.HostedScript/Library/ProcessOutputWrapper.cs b/src/ScriptEngine.HostedScript/Library/ProcessOutputWrapper.cs index 0ef56c7f3..ceacf1216 100644 --- a/src/ScriptEngine.HostedScript/Library/ProcessOutputWrapper.cs +++ b/src/ScriptEngine.HostedScript/Library/ProcessOutputWrapper.cs @@ -15,9 +15,7 @@ class ProcessOutputWrapper : TextReader private OutputVariant _variant; private StringBuilder _buffer = new StringBuilder(4096); private ReaderWriterLockSlim _locker; - - private ManualResetEventSlim _finalWriteEvent = new ManualResetEventSlim(); - + private int _bufferIndex = 0; private bool AlreadyReading { get; set; } @@ -45,14 +43,14 @@ public void StartReading() if (_variant == OutputVariant.Stdout) { Encoding = _process.StartInfo.StandardOutputEncoding; - _process.BeginOutputReadLine(); _process.OutputDataReceived += StreamDataReceived; + _process.BeginOutputReadLine(); } else { Encoding = _process.StartInfo.StandardErrorEncoding; - _process.BeginErrorReadLine(); _process.ErrorDataReceived += StreamDataReceived; + _process.BeginErrorReadLine(); } AlreadyReading = true; @@ -74,19 +72,13 @@ private void StreamDataReceived(object sender, sys.DataReceivedEventArgs e) { try { - _locker.EnterWriteLock(); + if (e.Data != null) { - if (e.Data != null) - { - if (_buffer.Length != 0) - _buffer.Append(System.Environment.NewLine); + _locker.EnterWriteLock(); + if (_buffer.Length != 0) + _buffer.Append(System.Environment.NewLine); - _buffer.Append(e.Data); - } - else - { - _finalWriteEvent.Set(); - } + _buffer.Append(e.Data); } } finally @@ -221,7 +213,7 @@ private void EnterReadLock() { if (_process.HasExited) { - _finalWriteEvent.Wait(); + _process.WaitForExit(); // ожидание закрытия потоков } _locker.EnterReadLock();