2016-01-31 2 views
0

Я использую экземпляр WebClient для загрузки потоковых данных в локальный файл асинхронно. Для WebClient есть событие DownloadFileCompleted, которое я могу проверить на завершенную загрузку. Но полученный аргумент AsyncCompletedEventArgs не имеет способа определить размер заполненного файла.Как получить заполненный загруженный размер при использовании .net WeClient DownloadFileAsync

Можете ли вы предложить мне способ определения загруженного размера.

var webClient = new WebClient(); 
webClient.DownloadFileCompleted += webClient_DownloadFileCompleted; 
webClient.DownloadFileAsync(new Uri(url), localPath); 

    void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
// it seems 'e' arg does not have any useful information related to the download. 
} 

Когда я использую событие DownloadProgressChanged, он срабатывает дважды даже для загрузки на 100% процентов. Поэтому я не могу точно рассчитать общие загружаемые размеры для разных потоков загрузки async webclient.

ответ

0

Я бы рекомендовал вместо этого использовать HttpClient и его асинхронную апию. Чем вы можете прочитать ответные заголовки HTTP, например. Content-Length. В качестве примера см. Код ниже.

static void Main(string[] args) 
    { 
     var uri = "http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/MD5SUMS"; 
     var path = "output.txt"; 
     DownloadFileAsync(uri, path); 
     Console.ReadKey(); 
    } 

    static async void DownloadFileAsync(string uri, string path) 
    { 
     var http = new HttpClient(); 
     var response = await http.GetAsync(uri); 
     Console.WriteLine(response.Content.Headers.ContentLength); 
     using (var responseStream = await response.Content.ReadAsStreamAsync()) 
     using (var localStream = File.Create(path)) 
      responseStream.CopyTo(localStream); 
    } 
Смежные вопросы