异步处理下载数据
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();
}
}
}
有没有一种简单的方法可以在下载仍在 运行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();
}
}
}