DownloadFileAsync не загружает файл

1

Я пытаюсь написать простое приложение, которое загружает один файл из Интернета.

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        Uri uri = new Uri("http://download.thinkbroadband.com/100MB.zip");

        // Specify that the DownloadFileCallback method gets called
        // when the download completes.
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCallback2);
        // Specify a progress notification handler.
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);
        client.DownloadFileAsync(uri, "serverdata.txt");

        Console.WriteLine("Download successful.");

    }
    private static void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
    {
        // Displays the operation identifier, and the transfer progress.
        Console.WriteLine("{0}    downloaded {1} of {2} bytes. {3} % complete...",
            (string)e.UserState,
            e.BytesReceived,
            e.TotalBytesToReceive,
            e.ProgressPercentage);
    }
    private static void DownloadFileCallback2(object sender, AsyncCompletedEventArgs e)
    {
        // Displays the operation identifier, and the transfer progress.
        Console.WriteLine("Download complete");
    }
}

Я поставил точку Console.WriteLine("Download complete"); в этой строке: Console.WriteLine("Download complete"); но его никогда не ударил. Программа создает пустой файл serverdata.txt. Я не получаю обновлений в консоли о загрузке% из DownloadProgressCallback. Что я сделал не так?

  • 8
    Ваша программа завершает работу сразу после начала загрузки. Вы должны сохранить его, пока загрузка не будет завершена.
  • 1
    Вместо Console.WriteLine("Download successful."); , напишите Console.ReadLine();
Показать ещё 2 комментария
Теги:

2 ответа

6
Лучший ответ

Я не пробовал это, но вы можете попробовать использовать свойство IsBusy:

while(client.IsBusy)
     Thread.Sleep(1000);

Console.WriteLine("Download successful.");

ИЛИ, используйте метод WebClient.DownloadFileTaskAsync если вы используете.NET 4.5

client.DownloadFileTaskAsync(uri, "serverdata.txt").Wait();
Console.WriteLine("Download successful.");
  • 0
    +1 Подход «задача» более элегантный.
1

Как говорят другие, используя DownloadFileTaskAsync, сделать вашу жизнь проще, когда дело доходит до завершения задачи. Вы можете либо await результат асинхронно, либо вызвать Wait() для ожидания блокировки.

Вот код:

private static void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
    {
        // Displays the operation identifier, and the transfer progress.
        Console.WriteLine("{0}    downloaded {1} of {2} bytes. {3} % complete...",
            ((TaskCompletionSource<object>)e.UserState).Task.AsyncState,
            e.BytesReceived,
            e.TotalBytesToReceive,
            e.ProgressPercentage);
    }

    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        Uri uri = new Uri("http://download.thinkbroadband.com/100MB.zip");

        // Specify a progress notification handler.
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);
        var task = client.DownloadFileTaskAsync(uri, "serverdata.txt"); // use Task based API

        task.Wait(); // Wait for download to complete, can deadlock in GUI apps

        Console.WriteLine("Download complete");

        Console.WriteLine("Download successful.");
    }

Вызов Wait() может быть заблокирован в приложении на основе графического интерфейса пользователя, но он подходит для вашего случая.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню