@Anton_repr

Как узнать, что асинхронный метод выполнил свою работу?

У меня есть 2 метода. Первый качает аудио и видео, а второй их объединяет.
У меня происходит ошибка - видео и аудио начинают объединяться до полного скачивания видео. Что мне делать?
public async void DownloadVideo1080P(string path, ProgressBar progressBar, string link)
{
    await ytClient.Videos.Streams.DownloadAsync(audioInfo, Path.Combine(newLink, $"audio.wav"));
    await ytClient.Videos.Streams.DownloadAsync(videoInfo, Path.Combine(newLink, $"video.mp4"), progressHandler);
}

public async void MergeAudioVideo(string link)
{
    await ffmpeg.ExecuteAsync($@"-i video.mp4  -i audio.wav -c:v copy -c:a aac newVideo.mp4");
}
  • Вопрос задан
  • 280 просмотров
Решения вопроса 2
ayazer
@ayazer
Sr. Software Engineer
async void
вернет управление обратно, не дожидаясь выполнения асинхронного кода внутри. вам же нужно возвращать таску

public async Task DownloadVideo1080PAsync(string path, ProgressBar progressBar, string link)
{
    await ytClient.Videos.Streams.DownloadAsync(audioInfo, Path.Combine(newLink, $"audio.wav"));
    await ytClient.Videos.Streams.DownloadAsync(videoInfo, Path.Combine(newLink, $"video.mp4"), progressHandler);
}

public Task MergeAudioVideoAsync(string link)
{
    return ffmpeg.ExecuteAsync($@"-i video.mp4  -i audio.wav -c:v copy -c:a aac newVideo.mp4");
}


....
  await DownloadVideo1080PAsync(....);
  await MergeAudioVideoAsync(...);
....
Ответ написан
Комментировать
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
вопрос довольно интересный. вы можете загружать синхронно, но придется дольше ждать
загружать асинхронно очень логично. но тогда вам надо изучать доки на api
вы часом не вот это используете?
https://developers.google.com/api-client-library/d...

если да, то логика примерно такая
https://developers.google.com/api-client-library/d...
по IDownloadProgress.Status вы узнаете когда будет 100%, но надо читать доки, возможно есть калбэк сообщающий конкретно о завершении

если другой api, все равно - у вас в коде, для видеопотока, указан progressHandler, сделайте такой же и для аудио. когда оба отловят 100%, тогда время и объединять..
.. еще точнее можно начинать. хотя может оказаться что какие то тайм ауты потребуются, если дисковая система не очень быстрая + загрузка в tmp, а потом копирование в целевую папку. об этом тоже надо искать инфу в доках на api. но когда отловите окончания загрузок, тайм ауты при необходимости, можно и экспериментально подбирать
.. или там изучить подписку на файловые события https://docs.microsoft.com/ru-ru/dotnet/api/system...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Убрать await, вернуть таски и ждать их завершения - https://docs.microsoft.com/ru-ru/dotnet/api/system...

Надо понимать, что асинхронный метод возвращает управление назад как только встретит await. Поэтому проста так вызвать два ваших метода подряд и надеяться на лучшее нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы