2015-02-02 4 views
0

Есть ли простой способ обработки загруженных данных во время загрузки? Я не хочу ждать завершения загрузки, чтобы перед обработкой иметь все данные на памяти или диске. Я хочу сделать это, потому что мои данные сжаты, и я хотел бы распаковать байтовые пакеты в прогоне и записать их прямо на диск. Чтобы я никогда не использовал больше памяти, чем один пакет загрузки.Процесс загрузки данных асинхронный

Я пытался ужиться с классом WebClient, но я не узнал, как получить доступ к последним загруженным байтам в событии DownloadProgressChanged.

Что-то вроде этого:

WebClient wc = new WebClient(); 
Uri uri = new Uri(myURL); 
wc.DownloadProgressChanged += wc_DownloadProgressChanged; 
wc.DownloadDataAsync(uri); 

... 

void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    ProcessData(e.Bytes,e.BytesReceived); //e.Bytes should access the downloaded byte packet 
    //but it doesn't exist 
} 

Я понял это уже с помощью Libcurl, но я хотел бы знать, если это возможно без использования внешних библиотек.

+0

вы всегда можете пойти вниз и использовать HTTP-запросы или даже TCP соединений, чтобы иметь лучший контроль, .NET имеет классы для обоих вариантов. – Luizgrs

+0

Спасибо, я посмотрю. – Showdown

ответ

0

не имели возможность протестировать его, но она могла бы работать что-то вроде этого:

public void DownloadFileAsync() 
    { 
     WebClient wc = new WebClient(); 
     Uri uri = new Uri(myURL); 
     //Open Stream from URI 
     wc.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCallback); 
     wc.OpenReadAsync(uri); 
    } 


    private static void OpenReadCallback(Object sender, OpenReadCompletedEventArgs e) 
    { 
     Stream resStream = null; 

     try 
     { 
      resStream = (Stream)e.Result; 
      //Your decompression stream Gzip for example 
      using (GZipStream compressionStream = new GZipStream(resStream, CompressionMode.Decompress)) 
      { 
       //write gzip stream to file 
       using (
        FileStream outFile = new FileStream(@"c:\mytarget.somefile", FileMode.Create, FileAccess.Write, 
         FileShare.None)) 
         compressionStream.CopyTo(outFile); 
      } 
     } 
     finally 
     { 
      if (resStream != null) 
      { 
       resStream.Close(); 
      } 
     } 
    } 
+0

«Оператор ожидания применяется к задаче в асинхронном методе, чтобы приостановить выполнение метода до тех пор, пока ожидаемая задача не завершится». Я подумал, что через «жду» у меня есть полные данные о memeory, которые я не хотел в первую очередь. Или я здесь не прав? – Showdown

+0

оператор ожидания ждет завершения задачи async. операция после ожидания по-прежнему выполняется asynchron, поэтому у вас не будет целых данных в памяти. Async ждет, просто управляет всей планировкой, вам приходилось делать вручную, когда вы использовали потоки. – BoeseB

+0

Хорошо, спасибо! Это уже что-то. Но не будут ли все данные загружены в мой поток/память, когда загрузка будет завершена? Или это последняя потоковая информация, освобожденная после каждой декомпрессии + копирование на диск? – Showdown

Смежные вопросы