如何使用Await / Task for DownloadFileAsync / UploadFileAsync或等待每个子程序执行

时间:2017-03-15 12:19:15

标签: vb.net asynchronous async-await webclient webclient-download

我正在尝试从网址下载并上传文件。但是,如果我将它们一起使用,如下所示,由于它们是异步功能,因此上载在下载之前开始,上传的字节显示为零。

tmp是一个字符串,包含要保存的文件的位置,uri包含本地服务器地址

Dim wc1 As New WebClient
wc1.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0)")
wc1.DownloadFileAsync(New Uri("file://192.XXX.X.X/volume(sda)/10mb.test"), tmp)

Dim wc2 As New WebClient
wc2.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0)")
wc2.UseDefaultCredentials = True
wc2.Credentials = New NetworkCredential("admin", "admin")
wc2.UploadFileAsync(New Uri("file://192.XXX.X.X/volume(sda)/10mb.test"), tmp)

但是,如果我使用DownloadFile / UploadFile而不是DownloadFileAsync / UploadFileAsync,它可以正常工作。但是,下面提到的功能不会执行。

AddHandler wc1.DownloadProgressChanged, AddressOf wc1_DownloadProgressChanged
AddHandler wc1.DownloadFileCompleted, AddressOf wc1_DownloadFileCompleted
AddHandler wc2.UploadProgressChanged, AddressOf wc2_UploadProgressChanged
AddHandler wc2.UploadFileCompleted, AddressOf wc2_UploadFileCompleted

async函数的情况是相同的,如果我使用while循环来检查webclient是否忙碌。 async函数不会调用任何ProgressChanged / Completed函数。

此外,我不确定如何使用,如果await / task函数按需要工作,async仍然可以访问ProgressChanged / Completed函数,并等待下载完成后再启动异步上传功能。< / p>

2 个答案:

答案 0 :(得分:2)

DownloadFileAsync / UploadFileAsync实际早于 async / await个关键字,因此与它们不兼容。

async / await点击该场景时,WebClient获得了一些与await兼容的方法;这些被称为DownloadFileTaskAsync / UploadFileTaskAsync。但是,我不确定他们是否会提出进展事件。

此外,您可能需要考虑使用HttpClient,它是从头开始设计为await兼容的。

答案 1 :(得分:0)

您的代码实际上是这样的吗?

Dim wc1 As New WebClient
AddHandler wc1.DownloadProgressChanged, AddressOf wc1_DownloadProgressChanged
AddHandler wc1.DownloadFileCompleted, AddressOf wc1_DownloadFileCompleted

wc1.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0)")
wc1.DownloadFileAsync(New Uri("file://192.XXX.X.X/volume(sda)/10mb.test"), tmp)    

Dim wc2 As New WebClient
AddHandler wc2.UploadProgressChanged, AddressOf wc2_UploadProgressChanged
AddHandler wc2.UploadFileCompleted, AddressOf wc2_UploadFileCompleted

wc2.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0)")
wc2.UseDefaultCredentials = True
wc2.Credentials = New NetworkCredential("admin", "admin")
wc2.UploadFileAsync(New Uri("file://192.XXX.X.X/volume(sda)/10mb.test"), tmp)    

在实例化WebClient之后,在将其用于触发事件处理程序之前,您需要AddHandlers。