处理下载数据异步

时间:2015-02-02 11:48:06

标签: c# .net download webclient asynchronous

在下载仍在运行时,是否有一种简单的方法来处理加载的数据? 我不想等待下载完成以便在处理之前将整个数据放在内存或磁盘上。我想这样做是因为我的数据已被压缩,我想要解压缩运行中的字节数据包然后将它们直接写入磁盘。所以我从不使用比一个下载包更多的内存。

我试图与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,但我想知道在不使用外部库的情况下是否可行。

1 个答案:

答案 0 :(得分: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();
            }
        }
    }