none
Process.Start() - как избавить вызывающую форму от зависания RRS feed

  • Вопрос

  • Добрый день, друзья.

    Я столлнулся с проблемой, когда я запускаю консольное приложение через process.start , которое использует тяжелые алгоритмы обработки специфического пакетного изображения, процесс обработки которого занимает больше минуты. Вот что я делаю:

    1. Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.
    2. В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
    3. while (!process.HasExited)
                  {
                      if(consoleOut != null)
                      {
                          _readStdOutput stdDelegate = readStdOutput;
                          Form.ActiveForm.Invoke(stdDelegate, process);
                      }
      
                      Thread.Sleep(1000);
                  }
      
      влияет ли это на зависание ? если я направильно делаю, как поступить ?
    4.  этого форма виснет и отвисает не скоро...
    очень важно, спасибо за содействие
    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:08 MSDN Forums Consolidation (От:Visual C#)
    18 декабря 2009 г. 10:51

Ответы

    1. Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
    Для того, чтобы не отображалось окно используй ProcessStartInfo.CreateNoWindow = true.

    1. while
       (!process.HasExited)
      {
      if (consoleOut != null )
      {
      _readStdOutput stdDelegate = readStdOutput;
      Form.ActiveForm.Invoke(stdDelegate, process);
      }

      Thread.Sleep(1000);
      }
    1. влияет ли это на зависание ? если я направильно делаю, как поступить ?
    2.  этого форма виснет и отвисает не скоро...
    Скорее всего зависает внутри метода readStdOutput при чтении вывода.
    А вообще вместо этого цикла лучше используй событие OutputDataReceived. Пример тут .

    • Предложено в качестве ответа creomobile 19 декабря 2009 г. 10:41
    • Помечено в качестве ответа I.Vorontsov 22 декабря 2009 г. 8:06
    18 декабря 2009 г. 21:22

Все ответы

    1. Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
    Для того, чтобы не отображалось окно используй ProcessStartInfo.CreateNoWindow = true.

    1. while
       (!process.HasExited)
      {
      if (consoleOut != null )
      {
      _readStdOutput stdDelegate = readStdOutput;
      Form.ActiveForm.Invoke(stdDelegate, process);
      }

      Thread.Sleep(1000);
      }
    1. влияет ли это на зависание ? если я направильно делаю, как поступить ?
    2.  этого форма виснет и отвисает не скоро...
    Скорее всего зависает внутри метода readStdOutput при чтении вывода.
    А вообще вместо этого цикла лучше используй событие OutputDataReceived. Пример тут .

    • Предложено в качестве ответа creomobile 19 декабря 2009 г. 10:41
    • Помечено в качестве ответа I.Vorontsov 22 декабря 2009 г. 8:06
    18 декабря 2009 г. 21:22
  • Спасибо за ценную информацию =)
    18 декабря 2009 г. 23:11