await WebClient.DownloadFileTaskAsyn c не работает - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь использовать WebClient.DownloadFileTaskAsync для загрузки файла, чтобы я мог использовать обработчики событий прогресса загрузки. Проблема в том, что, хотя я использую await на DownloadFileTaskAsync, на самом деле он не ждет, пока задача завершится sh, и мгновенно завершает работу с 0-байтовым файлом. Что я делаю не так?

internal static class Program
{
    private static void Main()
    {
        Download("http://ovh.net/files/1Gb.dat", "test.out");
    }

    private async static void Download(string url, string filePath)
    {
        using (var webClient = new WebClient())
        {
            IWebProxy webProxy = WebRequest.DefaultWebProxy;
            webProxy.Credentials = CredentialCache.DefaultCredentials;
            webClient.Proxy = webProxy;
            webClient.DownloadProgressChanged += (s, e) => Console.Write($"{e.ProgressPercentage}%");
            webClient.DownloadFileCompleted += (s, e) => Console.WriteLine();
            await webClient.DownloadFileTaskAsync(new Uri(url), filePath).ConfigureAwait(false);
        }
    }
}

1 Ответ

1 голос
/ 27 февраля 2020

Как уже отмечали другие, два показанных метода либо не асинхронны, либо не ожидаемы.

Во-первых, вы должны сделать свой метод загрузки ожидаемым:

private async static Task DownloadAsync(string url, string filePath)
{
    using (var webClient = new WebClient())
    {
        IWebProxy webProxy = WebRequest.DefaultWebProxy;
        webProxy.Credentials = CredentialCache.DefaultCredentials;
        webClient.Proxy = webProxy;
        webClient.DownloadProgressChanged += (s, e) => Console.Write($"{e.ProgressPercentage}%");
        webClient.DownloadFileCompleted += (s, e) => Console.WriteLine();
        await webClient.DownloadFileTaskAsync(new Uri(url), filePath).ConfigureAwait(false);
    }
}

Затем вы либо подождите Main:

private static void Main()
{
    DownloadAsync("http://ovh.net/files/1Gb.dat", "test.out").Wait();
}

Или сделайте его асинхронным тоже:

private static async Task Main()
{
    await DownloadAsync("http://ovh.net/files/1Gb.dat", "test.out");
}
...