0

Есть вот такой код:

using System.ComponentModel;
using System.Net;
using System.Net.Mime;
using ShellProgressBar;

class Program { static void Main() { Download(); }

static void Download()
{
    const int totalTicks = 100;

    var options = new ProgressBarOptions
    {
        ProgressCharacter = '─',
        ProgressBarOnBottom = true
    };

    using (WebClient wc = new WebClient())
    {
        var pbar = new ProgressBar(totalTicks, "Initial message", options);
        wc.DownloadProgressChanged += (s, e) => { pbar.Tick(e.ProgressPercentage,"Download XML Plugin..."); };
        wc.DownloadFileAsync(new Uri("http://dev.osel.pp.ua/Consulo/Plugins/com.intellij.xml_2961.zip"),"/home/ketronix/xml.tar.gz");
        Console.ReadKey();
    };
}

}

Он то работает, но я хочу чтобы по окончанию загрузки программа прекращала работу. Если другими словами - сейчас программа после загрузки ждет нажатия enter чтобы закрытся, как дальше нет никакого кода, можно сделать так чтобы она не ждала энтер, и если дальше кода нет, она вырубалась? А если код есть - продолжала работать? Всем спасибо.

1 Answers1

0

Если в лоб решать, то как-то так. Всегда решение подобных задач начинайте с чтения документации.

class Program
{
    static async Task Main()
    {
        await DownloadAsync();
    }
static async Task DownloadAsync()
{
    var options = new ProgressBarOptions
    {
        ProgressCharacter = '─',
        ProgressBarOnBottom = true
    };

    using (WebClient wc = new WebClient()) 
    {
        var pbar = new ProgressBar(totalTicks, "Initial message", options);
        wc.DownloadProgressChanged += (s, e) => { pbar.Tick(e.ProgressPercentage,"Download XML Plugin..."); };
        await wc.DownloadFileTaskAsync(new Uri("http://dev.osel.pp.ua/Consulo/Plugins/com.intellij.xml_2961.zip"),"/home/ketronix/xml.tar.gz");
    };
}

}

Имейте в виду, WebClient устарел и будет убран из .NET в будущем. Если интересует более современное решиение, то вот так.

aepot
  • 49,560
  • Кхм... У WebClient есть метод DownloadFileTaskAsync. – Alexander Petrov Jul 24 '22 at 19:58
  • @AlexanderPetrov да, спасибо, исправил ответ. На устаревших классах чего только не встретшь в названиях членов. Никогда бы не подумал, что этот метод существует, потому что его нормальное имя по факту занято. И что им мешало изменить void сигнатуру на Task при появлении TAP - тоже загадка. – aepot Jul 25 '22 at 06:57
  • Меня удивляет, почему в HttpClient не сделали метод GetFile. Когда народ гуглит, как скачать файл, то находят, что неудивительно, WebClient с его методами. – Alexander Petrov Jul 25 '22 at 07:56
  • @AlexanderPetrov наверное потому что скачивание файлов таким образом - не промышленная задача. К тому же скачать и записать на диск - это 2 задачи, которые для мелких файлов так же решаются в одну строку кода, а для больших нужен комплекс с отчетом о прогрессе и т.д. Возможно допишут метод расширения в комплект к методам типа GetJsonAsync и ReadAsJsonAsync. Но спроектировать это красиво и правильно не так то просто, быть может поэтому и нет пока. – aepot Jul 25 '22 at 08:12