Вворачиваю в самопальный лаунчер для самопальных программ систему обновления.
У меня есть готовая процедура обновления, которая запускается отдельным потоком для каждой доступной программы в лаунчере, через foreach()
(проверяет наличие новых файлов и загржаует их с сервера).
Есть момент на котором я встрял: при нажатии на кнопку запуска приложения из лаунчера должны проверяться обновления только для этой программы, а после должен производиться ее запуск.
Обновиться то она обновляется, но вот с пост-апдейтным запуском проблема. Как мне, не впихивая в поточную процедуру запуск приложения дождаться завершения конкретного потока и только потом выполнить команду?
На кнопку прописан код, например, такой:
Thread updateThread = new Thread(new ParameterizedThreadStart(CheckAndLoadUpdateFiles));
updateThread.Start(<appdata>);
StartAppliction(<appdata>.<appname>, <appdata>.<apppath>, <appdata>.<appparams>);
Я знаю, что StartApplication
выполнится сразу после старта потока и не хочу пихать эту процедуру в процедуру обновления.
Жду ваших предложения и советов.
Создание потока - ресурсоёмкая операция. Вместо создания потока вы можете использовать пул потоков. Также само ожидание вы можете сделать асинхронным. Пример:
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>));
}
Ожидание завершения потока:
updateThread.Join();
Вот описание функции https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.thread.join?view=netcore-2.1
Думаю есть смыл запускать новый поток, в котором будет:
Однако не исключаю, что есть более лаконичное решение, что бы не запускать потоки. Можно рассмотреть вариант реализации через 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>);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Допустим, есть окно, которое может создавать, как модальные окна, так и обычные окна
Необходимо получить список баз данных с датой их создания! Имеется сервер Mysql, создано очень много баз данных года с 2014Необходимо удалить...
Возможно ли как-то выполнять ajax запрос на сервер без ssl с сервера с ssl?