VB 中的异步文件下载不工作

Async file download in VB not working

我有以下内容:

wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
FileStream f = File.OpenWrite(insLoc + "\update.zip");
wc.DownloadDataAsync(new Uri("http://example.com/file.zip"), installLoc + "\file.zip");

(并在一个单独的函数中)

private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
    {
        if (e.Error == null) {
            MessageBox.Show("Download success");
        }
        else { MessageBox.Show("Download failed"); }

        f.Flush();
        f.Dispose();
    }

当我检查它应该下载到的文件时,它存在,但里面什么也没有(即,它是 0 字节)。下载完成后我刷新了 FileStream,这是怎么回事?我也有一个进度条,它慢慢增加到 100%,所以我知道它正在下载 ZIP 文件,并且显示 "Download Success" 消息框。

提前致谢!

您应该使用回调函数来保存生成的文件(表示为作为第二个参数传递的字节数组):

wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
wc.DownloadDataAsync(new Uri("http://example.com/file.zip"));

然后:

private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    if (e.Error == null) 
    {
        string resultFile = Path.Combine(insLoc, "update.zip");
        System.IO.File.WriteAllBytes(resultFile, e.Result);
        MessageBox.Show("Download success");
    }
    else 
    {
        MessageBox.Show("Download failed"); 
    }
}

现在您可以快速看到使用此方法整个文件在刷新到文件系统之前作为字节数组加载到内存中。这是非常低效的,尤其是当您下载大文件时。因此,建议改用 DownloadFileAsync 方法。

wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
string resultFile = Path.Combine(insLoc, "update.zip");
var uri = new Uri("http://example.com/file.zip");
wc.DownloadFileAsync(uri, resultFile);

以及对应的回调:

private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error == null) 
    {
        MessageBox.Show("Download success");
    }
    else 
    { 
        MessageBox.Show("Download failed"); 
    }
}

我会使用 WebClientDownloadFileTaskAsync 方法,我发现它使用起来非常简单..

await wc.DownloadFileTaskAsync(new Uri("http://example.com/file.zip"), installLoc + "\file.zip");

就是这样。如果想查看下载进度,可以附上DownloadProgressChanged活动