Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ограничение выполнения запущенного процесса по времени / 3 сообщений из 3, страница 1 из 1
26.05.2015, 10:54
    #38968421
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ограничение выполнения запущенного процесса по времени
я нуб в c#, но встала задачка, помогите кто чем может, пжлста.

в общем нужно запустить архивирование и если процесс длится больше часа, то завершить его.
вот никак не могу сообразить как сделать это.
после запуска процесса, если начать читать stdio, то он читает пока процесс не завершится.

вот такой код есть:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
        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) не получается.

наверняка это уже решалось как-то? может поможете? хоть в каком направлении это реализуется?
...
Рейтинг: 0 / 0
26.05.2015, 11:30
    #38968457
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ограничение выполнения запущенного процесса по времени
QEOS, проще будет через WaitForExit с таймаутом:
Код: c#
1.
2.
3.
4.
5.
6.
int timeout = (int)TimeSpan.FromHours(1).TotalMilliseconds);
proc.Start();
if (!proc.WaitForExit(timeout))
{
    proc.Kill();
}
...
Рейтинг: 0 / 0
26.05.2015, 11:44
    #38968482
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ограничение выполнения запущенного процесса по времени
bazile,

странно, но я пробовал так. только у меня ж еще была потребность в выводе этого процесса..
если я делал proc.StandardOutput.ReadToEnd(); то у меня писалось что не удалось получить вводвывод..
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ограничение выполнения запущенного процесса по времени / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]