Я пытаюсь написать простое приложение, которое загружает один файл из Интернета.
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
. Что я сделал не так?
Я не пробовал это, но вы можете попробовать использовать свойство 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.");
Как говорят другие, используя 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()
может быть заблокирован в приложении на основе графического интерфейса пользователя, но он подходит для вашего случая.
Console.WriteLine("Download successful.");
, напишитеConsole.ReadLine();