Лучший отвечающий
Process.Start() - как избавить вызывающую форму от зависания

Вопрос
-
Добрый день, друзья.Я столлнулся с проблемой, когда я запускаю консольное приложение через process.start , которое использует тяжелые алгоритмы обработки специфического пакетного изображения, процесс обработки которого занимает больше минуты. Вот что я делаю:
- Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.
- В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
-
while (!process.HasExited) { if(consoleOut != null) { _readStdOutput stdDelegate = readStdOutput; Form.ActiveForm.Invoke(stdDelegate, process); } Thread.Sleep(1000); }
- этого форма виснет и отвисает не скоро...
очень важно, спасибо за содействие- Перемещено Siddharth Chavan 1 октября 2010 г. 22:08 MSDN Forums Consolidation (От:Visual C#)
18 декабря 2009 г. 10:51
Ответы
-
Для того, чтобы не отображалось окно используй ProcessStartInfo.CreateNoWindow = true.- Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
Скорее всего зависает внутри метода readStdOutput при чтении вывода.-
while (!process.HasExited)
{
if (consoleOut != null )
{
_readStdOutput stdDelegate = readStdOutput;
Form.ActiveForm.Invoke(stdDelegate, process);
}
Thread.Sleep(1000);
}
- влияет ли это на зависание ? если я направильно делаю, как поступить ?
- этого форма виснет и отвисает не скоро...
А вообще вместо этого цикла лучше используй событие OutputDataReceived. Пример тут .
- Предложено в качестве ответа creomobile 19 декабря 2009 г. 10:41
- Помечено в качестве ответа I.Vorontsov 22 декабря 2009 г. 8:06
18 декабря 2009 г. 21:22
Все ответы
-
Для того, чтобы не отображалось окно используй ProcessStartInfo.CreateNoWindow = true.- Я пишу process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; но консолька не скрывается, а всеравно показывается.В цикле, проверяя не отработало ли приложение, я использую редирект вывода в текст бокс, вот так, при этом я эту работу выпобняю из отдельного потока, для чего запись в текст бокс выполняю через метод инвоук, чтобы не было кросс-поточности.
Скорее всего зависает внутри метода readStdOutput при чтении вывода.-
while (!process.HasExited)
{
if (consoleOut != null )
{
_readStdOutput stdDelegate = readStdOutput;
Form.ActiveForm.Invoke(stdDelegate, process);
}
Thread.Sleep(1000);
}
- влияет ли это на зависание ? если я направильно делаю, как поступить ?
- этого форма виснет и отвисает не скоро...
А вообще вместо этого цикла лучше используй событие OutputDataReceived. Пример тут .
- Предложено в качестве ответа creomobile 19 декабря 2009 г. 10:41
- Помечено в качестве ответа I.Vorontsov 22 декабря 2009 г. 8:06
18 декабря 2009 г. 21:22 -
Спасибо за ценную информацию =)18 декабря 2009 г. 23:11