Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39

Отследить окончание скачивания файла DownloadFileAsync

24.04.2019, 06:30. Показов 8497. Ответов 14

Студворк — интернет-сервис помощи студентам
Мне нужно скачать одну картинку. Но если использовать DownloadFile, то форма виснет. Мне этого не надо, поэтому я использую DownloadFileAsync. В дальнейшем эта картинка обрабатывается, поэтому, мне надо подождать пока она полностью загрузится, иначе получаю System.OutOfMemoryException: "Недостаточно памяти.".
Класс скачивания файла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class DownloadFile
    {
        public static void StartDownload(string url, string filename)
        {
            FileDownloaded = false;
            WebClient web = new WebClient();
            Uri uriUrl = new Uri(url);
            web.DownloadFileCompleted += new AsyncCompletedEventHandler(web_DownloadFileCompleted);
            web.DownloadFileAsync(uriUrl, filename);
        }
 
        static void web_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            FileDownloaded = true;
        }
 
        public static bool FileDownloaded { get; set; }
    }

класс откуда вызываю скачивание картинки
C#
1
2
3
DownloadFile.StartDownload(link, filename);
while (!DownloadFile.FileDownloaded)
    Thread.Sleep(100);
в системе я вижу, что файл скачивается, но моя форма виснет навсегда. Точка остановки в web_DownloadFileCompleted не срабатывает.

Мне нужно чтобы картинка качалась, форму в процессе скачивания можно было двигать (я у всех элементов формы кроме нужных сделаю Enable = false), а после скачивания алгоритм шёл дальше и в конце элементам вернулся Enable. Как узнать когда картинка полностью скачалась?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2019, 06:30
Ответы с готовыми решениями:

Дозакачка файла, если не докачался WebClient, DownloadFileAsync
Здравствуйте! Проблема в том, что при скачивании файла modpack.zip, он у меня скачивается не полностью и программа приступает к...

Отображение процесса скачивания файла
Всем привет) Вообщем у меня возникла проблемка, так вот, как по завершению скачивания файла высветить сообщение, Например: "Файл...

Ссылки для скачивания с помощью WebClient.DownloadFile и WebClient.DownloadFileAsync
Ссылки какие должны быть, для скачивания webClient.DownloadFile и webClient.DownloadFileAsync Не пойму какие ссылки должны быть чтоб...

14
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 06:33
Palm_Tree, используйте другой метод - DownloadFileTaskAsync и к нему async\await. Не надо этой фигни с коллбеками и вечными циклами.
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 07:00  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
используйте другой метод - DownloadFileTaskAsync
Сделал так:
Класс скачивания:
C#
1
2
3
4
5
6
7
8
  public static async void StartDownload(string link, string filename)
        {
            await Task.Run(() =>
            {
                WebClient wc = new WebClient();
                var downloadTask = wc.DownloadFileTaskAsync(new Uri(link), filename);
            });
        }
Класс откуда вызываю:
C#
1
 DownloadFile.StartDownload(link, filename);
дальше в коде при обращении к файлу получаю System.IO.FileNotFoundException.
Как подождать пока файл докачается?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 07:04
Palm_Tree, нафига вы асинхронный метод в таску запихнули? Вам показалось недостаточно асинхронно?
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 07:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Palm_Tree, нафига вы асинхронный метод в таску запихнули? Вам показалось недостаточно асинхронно?
Ваша правда, что-то в первый раз у меня так не получилось. Но в любом случае, в месте где надо скачать картинку:
C#
1
2
WebClient wc = new WebClient();
    wc.DownloadFileTaskAsync(new Uri(link), filename);
делаю вот так и получаю System.OutOfMemoryException. Как узнать скачался ли файл до конца?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 07:45
Palm_Tree, надо await'ить этот метод.
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 08:08  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
надо await'ить этот метод.
C#
1
2
3
4
5
public static async void StartDownload(string link, string filename)
        {
            WebClient wc = new WebClient();
            await wc.DownloadFileTaskAsync(new Uri(link), filename);
        }
и вызов
C#
1
DownloadFile.StartDownload(link, filename);
получаю System.OutOfMemoryException, т.е. файл ещё не скачался, а алгоритм дальше идёт
я, видимо, недопонимаю что-то. В чём проблема?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 08:16
Лучший ответ Сообщение было отмечено Palm_Tree как решение

Решение

Palm_Tree, вы правильно поняли. Только await немного не там воткнули. Окончание метода DownloadFileTaskAsync ожидается внутри метода StartDownload. А сам метод запускается на исполнение и код идёт дальше.

Уберите async\await из метода StartDownload. Верните из метода StartDownload объект Task, который возвращает метод DownloadFileTaskAsync.

Там, где вызывается StartDownload уже применяйте async\await.

Основной смысл: воткнуть ожидание (await) между кодом загрузки и дальнейшим кодом обработки результата загрузки.
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 08:33  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Окончание метода DownloadFileTaskAsync ожидается внутри метода StartDownload
у меня вот так вот:
C#
1
2
3
4
5
6
7
8
 public async static bool? CheckElinks()
        {
            bool? value = null;
            //some code
            await DownloadFile.StartDownload(link, filename);
            //some code
            return value;
        }
C#
1
2
3
4
5
6
7
public static Task StartDownload(string link, string filename)
        {
            WebClient wc = new WebClient();
            //wc.DownloadFileTaskAsync(new Uri(link), filename);
            var task = wc.DownloadFileTaskAsync(new Uri(link), filename);
            return task;
        }
мне надо чтобы метод Elinks возвращал bool?, но при этом в нём выполнялось скачивание картинки. Ругается на Elinks: мол, должен Task возвращать. Как вынести из Elinks скачивание картинки?
Кликните здесь для просмотра всего текста

замучился уже
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 08:55
Palm_Tree, либо метод CheckElinks дожидается окончания StartDownload, либо тоже возвращает Task<bool> с последующим его await'ом ещё выше.
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 08:57  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
метод CheckElinks дожидается окончания StartDownload
как это сделать?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 09:03
Palm_Tree,

C#
1
public async static Task<bool?> CheckElinks()
И ожидание (await) ещё выше.
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 09:05  [ТС]
это вот это
Цитата Сообщение от Usaga Посмотреть сообщение
либо тоже возвращает Task<bool> с последующим его await'ом ещё выше
а так как?
Цитата Сообщение от Usaga Посмотреть сообщение
либо метод CheckElinks дожидается окончания StartDownload
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,177
24.04.2019, 09:10
Лучший ответ Сообщение было отмечено Palm_Tree как решение

Решение

Palm_Tree, это оно и есть. Код внутри метода не пойдёт дальше строки await DownloadFile.StartDownload(link, filename); пока StartDownload не закончит работу.

Добавлено через 2 минуты
Просто сам метод CheckElinks тоже надо ждать. Как и тот, который его вызывает. И так вплоть до самого "верха" - обработчика события\метода WinForms, откуда всё началось.
1
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
24.04.2019, 09:22  [ТС]
уфффф, я разобрался
если кому надо:
Кнопка (асинхронная), по нажатию которой вызывается метод:
C#
1
2
3
4
5
private async void Button1_ClickAsync(object sender, EventArgs e)
    {
        rtbAnalysis.AppendText(Result.Show(await Analysis.CheckElinks()));
        //Result.Show получает bool? и в зависимости от значения возвращает соответствующий string
    }

Вызов метода, скачивающего картинку:
C#
1
2
3
4
public async static Task<bool?> CheckElinks()
    {
        await DownloadFile.StartDownload(link, filename);
    }
Метод, качающий картинку:
C#
1
2
3
4
5
6
7
8
9
class DownloadFile
    {
        public static Task StartDownload(string link, string filename)
        {
            WebClient wc = new WebClient();
            var task = wc.DownloadFileTaskAsync(new Uri(link), filename);
            return task;
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2019, 09:22
Помогаю со студенческими работами здесь

Как отловить окончание загрузки файла
Доброго времени суток, я хотел узнать как для данной функции отловить окончание загрузки файла, мне нужно сделать инкремент, когда...

Автоматизация скачивания файла по ftp
необходимо скачивать файл c ftp если он существует, думаю так: получать лист существующих файлов на ftp проверять наличие выполнять...

Отображение прогресса скачивания файла
Как заставить прогресс бар работать. Например я скачиваю файл из интернета а он показывает сколько осталось. Или я открываю файл тоже...

Выполнение разархивации ПОСЛЕ скачивания файла
Мужики, такая у меня проблема: я скачиваю файл, потом пытаюсь его распаковать, но распаковка происходит еще до полного скачивания файла....

WebClient признак полного скачивания файла
Цель: получить код html-страницы. Пробовал использовать WebClient.DownloadFile . не пошло, потому что иногда он завешивал выполнение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru