|
c#, ограничение выполнения запущенного процесса по времени | ☑ | ||
---|---|---|---|---|
0
qeos
26.05.15
✎
11:09
|
продублирую сюда тоже может тут активней публика.
я нуб в c#, но встала задачка, помогите кто чем может, пжлста. в общем нужно запустить архивирование и если процесс длится больше часа, то завершить его. вот никак не могу сообразить как сделать это. после запуска процесса, если начать читать stdio, то он читает пока процесс не завершится. вот такой код есть: - public void Pack() { string baseFolder = _baseFolder.Length > 0 ? "\"" + _baseFolder + "\"" : ""; var proc = new Process(); var psInfo = proc.StartInfo; psInfo.FileName = FullNamePackerExe; psInfo.Arguments = CommanLineParameter + " \"" + _archiveFileName + "\" \"" + _sourceFileName + "\" " + baseFolder; psInfo.WindowStyle = ProcessWindowStyle.Hidden; psInfo.RedirectStandardOutput = true; psInfo.RedirectStandardError = true; psInfo.UseShellExecute = false; string output = ""; string errors = ""; int c; try { proc.Start(); if (proc != null) { int howMuchMinutes = 0; while (true) { if (proc.StandardOutput.Peek() >= 0) { c = proc.StandardOutput.Read(); output += (char)c; } if (proc.StandardError.Peek() >= 0) { c = proc.StandardError.Read(); errors += (char)c; } proc.WaitForExit(1000); // by 1 minutes if (proc.HasExited) { break; } if (howMuchMinutes >= 5) // put there how long process must be { proc.Kill(); AddLogString("Превышено время архивации (" + howMuchMinutes.ToString() + " минут). Процесс остановлен."); } howMuchMinutes--; } } } catch (Exception ee) { AddLogString("Ошибка в процессе сжатия RAR: " + ee.Message + "\r\nstdoutput: " + output + "\r\nerroutput:" + errors); } if (proc.ExitCode != 0) { output = proc.StandardOutput.ReadToEnd(); errors = proc.StandardError.ReadToEnd(); AddLogString("Ошибка в процессе сжатия RAR ExitCode: " + proc.ExitCode + "\r\nstdoutput" + output + "\r\nerroutput" + errors); } } вот этот Peek() оказывается тоже ждет символ или хз чего он там ждет, но проверить через proc.WaitForExit(1000) не получается. наверняка это уже решалось как-то? может поможете? хоть в каком направлении это реализуется? |
|||
1
Garikk
26.05.15
✎
11:13
|
не вникал в код, но сходу можно попробовать отдельный тред который будет время считать
|
|||
2
Garikk
26.05.15
✎
11:17
|
proc.WaitForExit(1000); // by 1 minutes
-- это 1 секунда вообщето |
|||
3
Serginio1
26.05.15
✎
11:19
|
https://msdn.microsoft.com/en-us/library/ty0d8k56(v=vs.110).aspx
public bool WaitForExit( int milliseconds ) process.WaitForExit(1000 * 60 * 5); // wait up to 5 minutes. |
|||
4
qeos
26.05.15
✎
11:20
|
(2) это для тестирования поменял
|
|||
5
Господин ПЖ
26.05.15
✎
11:20
|
||||
6
qeos
26.05.15
✎
11:23
|
(5) во.. т.е. в отдельном потоке "убивающий" таймер, ща попробуем
|
|||
7
H A D G E H O G s
26.05.15
✎
11:43
|
Ниче не понимаю в этих ваших недоязыках, но есть жеж человечью
WaitForSingleObject() https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx |
|||
8
Serginio1
26.05.15
✎
12:02
|
(7) Поучи C# полезно. Поверь.
https://msdn.microsoft.com/ru-ru/library/dd460717(v=vs.110).aspx https://msdn.microsoft.com/ru-ru/library/hh191443.aspx |
|||
9
Jaap Vduul
26.05.15
✎
12:05
|
Я бы так сделал:
Task.Factory.StartNew(() => { Thread.Sleep(216000000); proc.Kill(); }); var output = proc.StandardOutput.ReadToEnd(); var errors = proc.StandardError.ReadToEnd(); proc.WaitForExit(); |
|||
10
qeos
26.05.15
✎
12:43
|
(9) сделал по другому...
proc.StandardOutput.ReadToEnd(); читаю только если нужно, только в catch или ExitCode.. proc.WaitForExit(1000*60); в цикле.. если превышен, то kill почему то раньше такой вариант не прокатывал.... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |