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