0

URL에서 파일을 다운로드하고 업로드하려고합니다. 그러나 아래와 같이 비동기 함수이므로 업로드하기 전에 업로드가 시작되고 업로드 된 바이트는 0으로 표시됩니다.Await/Task for DownloadFileAsync/UploadFileAsync를 사용하는 방법 또는 각 하위 작업이 완료 될 때까지 기다리는 대체 방법

tmp를 저장할 수있는 파일의 위치를 ​​포함하는 문자열과 URI 내가 대신 DownloadFileAsync/UploadFileAsync의 DownloadFile/UploadFile로를 사용하는 경우, 그것은 잘 작동하지만 로컬 서버 주소

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) 

가 포함되어 있습니다. 그러나 아래에 언급 된 기능은 실행되지 않습니다.

while 루프를 사용하여 웹 클라이언트가 사용 중인지 확인하는 경우 비동기 기능의 경우와 동일합니다. 비동기 함수는 ProgressChanged/Completed 함수를 호출하지 않습니다.

또한 잘 모르겠다. 비동기 업로드 기능을 시작하기 전에 다운로드가 완료 될 때까지 기다리는 것과 함께 async가 필요한만큼 대기/작업 기능이 계속 작동하는지 확인해야한다.

+0

UploadFileAsync를 먼저 완료해야합니까? 완료되면 DownloadFileAsync? – urlreader

+0

시도해 보았습니다. 그런 다음 다운로드가 완료되고 0으로 다운로드 된 바이트가 표시됩니다. 업로드가 나중에 시작되어 정상적으로 작동합니다. –

답변

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)  

당신은 AddHandlers이 필요하고 당신이 넣어 전에 이벤트 핸들러가 실행되는 것이 작동 할 수 있습니다.

+0

제쳐두고,'wc2.Credentials = New NetworkCredential (...) '과 함께'wc2.UseDefaultCredentials = True'를 사용해서는 안됩니다 - 둘 중 하나를 선택하십시오. – MrGadget

+0

클래스/폼/모듈의 맨 위에 'Private WithEvents wc as New WebClient'라는 단일 WebClient가있는이 묶음을 단순화하여 모든 작업에 사용할 수 있습니다.이 작업을 통해 IDE에서 사용자와 사용자의 이벤트 처리기를 생성 할 수 있습니다. 'AddHandler' 라인을 필요로하지 않도록 자동으로 연결하십시오. – MrGadget

+0

이벤트가 발생하기 전에 추가 된 AddHandler를 실제로 사용해 보았습니다 ('Private Sub wc_DownloadFileCompleted (Send As As Object, e As System.ComponentModel.AsyncCompletedEventArgs) wc.DownloadFileCompleted'처리). 그러나 같은 문제. 다운로드하기 전에 업로드가 시작되고 업로드 된 바이트는 0으로 표시됩니다. 미안, 내가 분명히하지 않았다면. –

2

DownloadFileAsync/UploadFileAsync 실제로 에게 async/await 키워드를 앞선와 같은 그들과 호환되지 않습니다. async/await 현장에 충돌 할 때

WebClientawait 호환 일부 새로운 방법을 가지고; 이들은 DownloadFileTaskAsync/UploadFileTaskAsync입니다. 그러나 진행 상황을 올릴 지 여부는 확실하지 않습니다.

또한 await 호환 가능으로 설계된 HttpClient을 사용하는 것이 좋습니다.