异步处理下载数据

Process download data asynchronous

有没有一种简单的方法可以在下载仍在 运行ning 时处理加载的数据? 我不想在处理之前等待下载完成将整个数据存储在内存或磁盘上。我想这样做是因为我的数据是压缩的,我想解压缩 运行 上的字节包,然后将它们直接写入磁盘。所以我永远不会使用超过一个下载包的内存。

我尝试与 WebClient 相处 class 但我没有找到如何访问 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 想通了,但我想知道是否可以不使用外部库。

还没有机会测试它,但它可以像这样工作:

    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();
            }
        }
    }