Код C# выполняется бесконечно

babkazombie

Client
Регистрация
02.03.2019
Сообщения
8
Реакции
4
Баллы
3
Доброго времени суток
Появилась проблема в шаблоне, который должен скачивать видео с сайта в двух качествах одновременно (720p и 1080p)
В ProjectMaker все отрабатывает как надо, без единой ошибки, шаблон дожидается скачивания обоих видео и продолжает работу дальше
А вот в Zennoposter оба видео скачиваются, но после этого шаблон просто стоит на месте, не выполняя следующие действия
Как это можно исправить?
Код приложил ниже

string directory = project.Directory;
string DownloadURL = "https://"+project.Variables["FullHD"].Value; //ссылка на скачивание видео
string FilePath = directory + "\\Video\\1080\\"+project.Variables["Video_Name"].Value+" (1080).mp4"; // путь к скачанному файлу на компе
bool done1 = false;
WebClient myWebClient = new WebClient();
myWebClient.DownloadFileCompleted += (sender, e) => done1 = true;
myWebClient.DownloadFileAsync(new Uri(DownloadURL), FilePath);

string DownloadURL1 = "https://"+project.Variables["HD"].Value; //ссылка на скачивание видео
string FilePath1 = directory + "\\Video\\720\\"+project.Variables["Video_Name"].Value+".mp4"; // путь к скачанному файлу на компе
bool done2 = false;
WebClient myWebClient1 = new WebClient();
myWebClient1.DownloadFileCompleted += (sender, e) => done2 = true;
myWebClient1.DownloadFileAsync(new Uri(DownloadURL1), FilePath1);

while(done1==false || done2==false){

}
 
Доброго времени суток
Появилась проблема в шаблоне, который должен скачивать видео с сайта в двух качествах одновременно (720p и 1080p)
В ProjectMaker все отрабатывает как надо, без единой ошибки, шаблон дожидается скачивания обоих видео и продолжает работу дальше
А вот в Zennoposter оба видео скачиваются, но после этого шаблон просто стоит на месте, не выполняя следующие действия
Как это можно исправить?
Код приложил ниже

string directory = project.Directory;
string DownloadURL = "https://"+project.Variables["FullHD"].Value; //ссылка на скачивание видео
string FilePath = directory + "\\Video\\1080\\"+project.Variables["Video_Name"].Value+" (1080).mp4"; // путь к скачанному файлу на компе
bool done1 = false;
WebClient myWebClient = new WebClient();
myWebClient.DownloadFileCompleted += (sender, e) => done1 = true;
myWebClient.DownloadFileAsync(new Uri(DownloadURL), FilePath);

string DownloadURL1 = "https://"+project.Variables["HD"].Value; //ссылка на скачивание видео
string FilePath1 = directory + "\\Video\\720\\"+project.Variables["Video_Name"].Value+".mp4"; // путь к скачанному файлу на компе
bool done2 = false;
WebClient myWebClient1 = new WebClient();
myWebClient1.DownloadFileCompleted += (sender, e) => done2 = true;
myWebClient1.DownloadFileAsync(new Uri(DownloadURL1), FilePath1);

while(done1==false || done2==false){

}
Здравствуйте,

Уберите данный кусок кода:
C#:
Развернуть Свернуть Копировать
while(done1==false || done2==false){

}
 
  • Спасибо
Реакции: babkazombie
Код писал ChatGPT:

Вариант №1

Переделал скачивание без DownloadFileAsync и бесконечного while.
Теперь используется обычный DownloadFile, который сам ждёт завершения загрузки файла, поэтому зависания из-за done1/done2 больше не будет.

Также:
  • автоматически создаются папки 1080 и 720, если их нет;
  • добавлен try/catch для нормального вывода ошибки;
  • код работает последовательно: сначала скачивается 1080p, потом 720p;
  • Directory.CreateDirectory(...) безопасен и не пересоздаёт папку каждый раз, если она уже существует.
В итоге код стал проще, стабильнее и без бесконечного ожидания.

C#:
Развернуть Свернуть Копировать
try
{
    string directory = project.Variables["directory"].Value;

    string videoName = project.Variables["Video_Name"].Value;
    string fullHdUrl = "https://" + project.Variables["FullHD"].Value;
    string hdUrl = "https://" + project.Variables["HD"].Value;

    string dir1080 = System.IO.Path.Combine(directory, "Video", "1080");
    string dir720 = System.IO.Path.Combine(directory, "Video", "720");

    System.IO.Directory.CreateDirectory(dir1080);
    System.IO.Directory.CreateDirectory(dir720);

    string file1080 = System.IO.Path.Combine(dir1080, videoName + " (1080).mp4");
    string file720 = System.IO.Path.Combine(dir720, videoName + ".mp4");

    using (System.Net.WebClient wc = new System.Net.WebClient())
    {
        wc.DownloadFile(fullHdUrl, file1080);
        wc.DownloadFile(hdUrl, file720);
    }

    project.SendInfoToLog("Файлы скачаны успешно", true);
}
catch (Exception ex)
{
    throw new Exception("Ошибка скачивания файлов: " + ex.Message, ex);
}


Вариант №2

Параллельное скачивание двух видео через Task.Run.
Теперь оба файла (1080p и 720p) скачиваются одновременно, а Task.WaitAll(...) ждёт завершения обеих загрузок перед продолжением выполнения шаблона.

Что изменено:
  • убран DownloadFileAsync и бесконечный while, из-за которого код мог зависать;
  • добавлено параллельное скачивание через Task;
  • автоматически создаются папки для сохранения файлов;
  • добавлена обработка AggregateException для корректного вывода ошибок из потоков;
  • код ждёт полного завершения обеих загрузок и не уходит дальше раньше времени.
В итоге загрузка работает быстрее за счёт параллельного скачивания и без риска бесконечного ожидания.

C#:
Развернуть Свернуть Копировать
try
{
    string directory = project.Variables["directory"].Value;
    string videoName = project.Variables["Video_Name"].Value;

    string fullHdUrl = "https://" + project.Variables["FullHD"].Value;
    string hdUrl = "https://" + project.Variables["HD"].Value;

    string dir1080 = System.IO.Path.Combine(directory, "Video", "1080");
    string dir720 = System.IO.Path.Combine(directory, "Video", "720");

    System.IO.Directory.CreateDirectory(dir1080);
    System.IO.Directory.CreateDirectory(dir720);

    string file1080 = System.IO.Path.Combine(dir1080, videoName + " (1080).mp4");
    string file720 = System.IO.Path.Combine(dir720, videoName + ".mp4");

    System.Threading.Tasks.Task task1 = System.Threading.Tasks.Task.Run(() =>
    {
        using (System.Net.WebClient wc = new System.Net.WebClient())
        {
            wc.DownloadFile(fullHdUrl, file1080);
        }
    });

    System.Threading.Tasks.Task task2 = System.Threading.Tasks.Task.Run(() =>
    {
        using (System.Net.WebClient wc = new System.Net.WebClient())
        {
            wc.DownloadFile(hdUrl, file720);
        }
    });

    Threading.Tasks.Task.WaitAll(task1, task2);

    project.SendInfoToLog("Файлы скачаны успешно", true);
}
catch (AggregateException ex)
{
    throw new Exception("Ошибка скачивания файлов: " + ex.Flatten().InnerException.Message, ex);
}
catch (Exception ex)
{
    throw new Exception("Ошибка скачивания файлов: " + ex.Message, ex);
}
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)