powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
9 сообщений из 9, страница 1 из 1
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39045212
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Public Sub ShellAndContinueNet(ByVal AppToRun As String, ByVal mode As AppWinStyle)
    'нехорошей является ситуация когда на момент GetProcessById сам процесс уже завершился
    'чтобы ее предотвратить, выходим по исключению
    Try
      Dim MyProcess As Process = Process.GetProcessById(Shell(AppToRun, mode))
      Do While Not MyProcess.HasExited
        Application.DoEvents()
      Loop
    Catch
    End Try
  End Sub


Второй
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  Public Sub ShellAndContinue(ByVal AppToRun As String, ByVal mode As AppWinStyle)
    'исключение на случай некорректного/несуществующего AppToRun
    Try
      Dim RetVal As Integer

      'The next line launches AppToRun,
      'captures process ID
      Dim hProcess As IntPtr = OpenProcess(PROCESS_QUERY_INFORMATION, True, Shell(AppToRun, mode))
      Do
        'Get the status of the process
        GetExitCodeProcess(hProcess, RetVal)
        Application.DoEvents()
        'Loop while the process is active
      Loop While RetVal = STILL_ACTIVE
    Catch
    End Try
  End Sub



Используется в частности когда надо запустить какую-нибудь c++ утилиту.
Я при написании приложения (считай готово) широко использовал первый вариант,
ибо ".Net" блин.
И все было замечательно, но рискнул сегодня испытать на 10-ке (на 8.1 проблем не было).
ShellAndContinueNet включил тормоза: секундная операция может висеть минуту (не сама операция, а ожидание понимания что она завершилась).
Второй (ShellAndContinue)- летает на тех же операциях.

Я думаю просто тупо код внутри ShellAndContinueNet заменить на код из ShellAndContinue и перекомпилировать все где это используется.

Вопрос: коды полностью эквивалентны (надо запустить AppToRun и тупо дождаться завершения)?
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39048199
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39048657
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Process.Exited - событие
Судя по всему ты предложил третий вариант на твой взгляд более грамотный (с чем спорить не буду).
Но и не воспользуюсь (в готовом приложении с годами проверенным вторым вариантом, пусть даже он и грубоват).

Вообще первый вариант с Do While Not MyProcess.HasExited беспроблемно работает и на 10-ке в большинстве случаев.
"Подвис" с первым вариантом возникает грубо тогда,
когда приложение 1 (.Net) запускает второй экземпляр себя-же через ShellAndContinueNet(с параметром с целью сделать какое-то определенное действо),
а этот второй экземпляр через ту же функцию ShellAndContinueNet запускает приложение 2 (в моем случае не .Net).
Короче первый экземпляр ждет второй экземпляр, а второй ждет приложение 2 по тому же принципу.
И на 10-ке здесь с большой вероятностью "подвис", хотя на 8.1 ничего подобного не наблюдалось.
Подозреваю причина в .Net реализации Process, и в сложном частном случае оно споткнулось об новую OS.

Короче, я заменил везде код ShellAndContinueNet на код ShellAndContinue и проблема больше не вылазит.
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39048675
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но и не воспользуюсь (в готовом приложении с годами проверенным вторым вариантом, пусть даже он и грубоват).Зря.
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39048717
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        async void button1_Click(object sender, EventArgs e)
        {
            await StartProcessAsync("notepad.exe");
            MessageBox.Show("Exited.");
        }

        Task StartProcessAsync(string fileName)
        {
            var tcs = new TaskCompletionSource<object>();
            var p = new Process();
            p.StartInfo = new ProcessStartInfo { FileName = fileName };
            p.EnableRaisingEvents = true;
            p.Exited += (s, e) => tcs.SetResult(null);
            p.Start();
            return tcs.Task;
        }
    }
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39049400
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗря.
Зря не зря, но по-любому то что ты написал, относится к .Net 4.5.
А у меня все .Net -файлы задублированы .Net4.5/.Net2.0 (т.е. прога на XP/2003 устанавливается как .Net 2.0, а на >=Vista как .Net 4.5, ничего стратегически лучшего для обеспечения работы .Net проги на всех ос я не придумал).
Так что здесь без вариантов.
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39049418
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, ну напиши без await, через Task.ContinueWith. Будет работать с .Net 4 и старше, что соответствует WinXP SP3 и старше.
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39049506
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Слушай, ну я согласен с тобой.
Нет времени спорить.
Просто ShellAndContinue железно работал еще в VB6 (где всего "этого" не было), проект очень большой, под .Net уже переделан и именно как я сказал (.Net2.0/.Net4.5 автовыбором в зависимости от ОС, выбирается инсталлятором, без .Net4.0 который типа работает на XP). Я итак сутки потратил чтоб все exe перекомпилировать со старой версией ф-ции и хотяб поверхностно протестировать, что ничего не глюкнуло. Ну, заодно манифесты под Win10 во все файлы добавил.
И не заметил бы этого глюка, если б не догадался проверить на Win10 перед релизом (искренне считал что Win8.1==Win10 ан нет).
Мне счас задача проект выпустить, а не Task-философией заниматься.
...
Рейтинг: 0 / 0
Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
    #39049688
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

OK
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск иного приложения с ожиданием завершения. Эквивалентны ли 2 кода?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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