Выполнить команду по завершении потока

106
09 августа 2021, 12:50

Вворачиваю в самопальный лаунчер для самопальных программ систему обновления. У меня есть готовая процедура обновления, которая запускается отдельным потоком для каждой доступной программы в лаунчере, через foreach() (проверяет наличие новых файлов и загржаует их с сервера).

Есть момент на котором я встрял: при нажатии на кнопку запуска приложения из лаунчера должны проверяться обновления только для этой программы, а после должен производиться ее запуск.

Обновиться то она обновляется, но вот с пост-апдейтным запуском проблема. Как мне, не впихивая в поточную процедуру запуск приложения дождаться завершения конкретного потока и только потом выполнить команду?

На кнопку прописан код, например, такой:

Thread updateThread = new Thread(new ParameterizedThreadStart(CheckAndLoadUpdateFiles));
updateThread.Start(<appdata>);
StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>);

Я знаю, что StartApplication выполнится сразу после старта потока и не хочу пихать эту процедуру в процедуру обновления.

Жду ваших предложения и советов.

Answer 1

Создание потока - ресурсоёмкая операция. Вместо создания потока вы можете использовать пул потоков. Также само ожидание вы можете сделать асинхронным. Пример:

async void buttonRun_Click()
{
    await Task.Run(()=>CheckAndLoadUpdateFiles(<appdata>));
    StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>);
}

ну или так

async void buttonRun_Click()
{
    await Task.Run(()=>CheckAndLoadUpdateFiles(<appdata>));
    await Task.Run(()=>StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>));       
}

На худой конец так

void buttonRun_Click()
{
    Task.Run(() => CheckAndLoadUpdateFiles(<appdata>))
        .ContinueWith(t=>StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>));     
}
Answer 2

Ожидание завершения потока:

updateThread.Join();

Вот описание функции https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.thread.join?view=netcore-2.1

Думаю есть смыл запускать новый поток, в котором будет:

  1. Запуск потока обновления
  2. Ожидание завершения потока обновления
  3. Запуск приложения

Однако не исключаю, что есть более лаконичное решение, что бы не запускать потоки. Можно рассмотреть вариант реализации через Tack.

UPDATE

Вот пример кода:

void buttonRun_Click()
{
    Thread updateAndLaunchThread = new Thread(new ParameterizedThreadStart(ThreadUpdateAndLaunch));
    updateAndLaunchThread.Start();
}
void ThreadUpdateAndLaunch()
{
    Thread updateThread = new Thread(new ParameterizedThreadStart(CheckAndLoadUpdateFiles));
    updateThread.Start(<appdata>);
    updateThread.Join();
    StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>);
}
READ ALSO
Не блокируемые окна

Не блокируемые окна

Допустим, есть окно, которое может создавать, как модальные окна, так и обычные окна

90
Получить дату создания базы данных

Получить дату создания базы данных

Необходимо получить список баз данных с датой их создания! Имеется сервер Mysql, создано очень много баз данных года с 2014Необходимо удалить...

152
Пересоздание массива. Foreach

Пересоздание массива. Foreach

Что-то туплю на ровном месте

118
ajax post на сервер без ssl

ajax post на сервер без ssl

Возможно ли как-то выполнять ajax запрос на сервер без ssl с сервера с ssl?

253