Puj, Async в конце названия метода значит "асинхронный".
Происходит так:
web.DownloadFileAsync(uri, "thr.html");
Задача запускается в новом параллельном потоке, а управление возвращается в вызывающий метод.
Дальше у вас происходит выход из блока using, который "под капотом" вызывает метод Dispose() у веб-клиента.
Сборщик мусора утилизирует веб-клиента и файл, скорее всего, не скачивается.
Что делать:
1. Прочитать, как работает модель TAP (Task Await Pattern).
2. Понимать, что необходимо ожидать await завершения асинхронного метода
3. Если файлик скачать нужно только один и он небольшого размера, заменить DownloadFileAsync просто на DownloadFile. Ценой нескольких миллисекунд блокировки основного интерфейса