У меня есть несколько файлов для загрузки (на FTP-сервер), используя этот код:VB.Net Webclient Загрузить висячие
Private Sub UploadFile(ByVal local As String)
If wc.IsBusy = True Then Throw New Exception("An upload is already ongoing!")
wc.Credentials = New NetworkCredential(usr.ToString, pass.ToString) 'Set the credentials.
'total_dl_size = GetDownloadSize(url) 'Get the size of the current file.
Try
Dim FileName As String = Path.GetFileName(local) 'Get the current file's name.
AppendWarning("Uploading " & FileName & "... ") 'Download notice.
wc.UploadFileAsync(New Uri(info_srv & local), Path.Combine(mc_dir, local)) 'Download the file to the desktop (use your own path here).
Catch ex As Exception
AppendWarning("-ERR: Could not download file: " & local & ControlChars.NewLine)
End Try
End Sub
Private Sub AppendWarning(ByVal Text As String)
If tb_warnings.InvokeRequired Then
tb_warnings.Invoke(Sub() tb_warnings.AppendText(Text))
Else
tb_warnings.AppendText(Text)
End If
End Sub
Private Sub wc_UploadProgressChanged(sender As Object, e As System.Net.UploadProgressChangedEventArgs) Handles wc.UploadProgressChanged
total_ul = e.BytesSent
Dim Progress As Integer = CType(Math.Round((baseline + total_ul) * 100)/total_ul_size, Integer)
If ProgressBar1.InvokeRequired Then
ProgressBar1.Invoke(Sub()
If Progress > 100 Then Progress = 100
If Progress < 0 Then Progress = 0
ProgressBar1.Value = Progress
End Sub)
Else
If Progress > 100 Then Progress = 100
If Progress < 0 Then Progress = 0
ProgressBar1.Value = Progress
End If
If lbl_progress.InvokeRequired Then
lbl_progress.Invoke(Sub() lbl_progress.Text = ((total_ul + baseline)/1024).ToString("N0") & " KB/" & (total_ul_size/1024).ToString("N0") & " KB")
Else
lbl_progress.Text = ((total_ul + baseline)/1024).ToString("N0") & " KB/" & (total_ul_size/1024).ToString("N0") & " KB | " & Progress.ToString & "%"
End If
End Sub
Private Sub wc_uploadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.UploadDataCompleted
If e.Cancelled Then
MessageBox.Show(e.Cancelled)
ElseIf Not e.Error Is Nothing Then
MessageBox.Show(e.Error.Message)
Else
If files.Count > 0 Then
AppendWarning("Upload Complete!" & ControlChars.NewLine)
baseline = baseline + total_ul
Dim file As String = files.Dequeue()
MsgBox(file)
UploadFile(file) 'Download the next file.
Else
AppendWarning("All Uploads Finished!" & ControlChars.NewLine)
End If
End If
Однако, используя два моих тестовых файлов, он всегда останавливается на то, что иначе будет конец первый файл, который я ему дал, и не переходит на второй.
Однако у меня есть FTP-клиент, подключенный к этому же серверу, и когда я обновляюсь, я вижу (по крайней мере для первого файла) данные правильно загружаются.
Какие-либо предложения относительно неправильного использования здесь?
Редактировать, бревенчатый: http://pastebin.com/kqG28NGH
Спасибо за любую помощь!
Вызываются ли 'wc_UploadProgressChanged' и' wc_uploadFileCompleted'? У вас такая же проблема с синхронной загрузкой? Что значит «останавливается» в любом случае? Покажите нам [файл журнала] (http://stackoverflow.com/q/9664650/850848). –
@MartinPrikryl прогресс, завершение не похоже. Я еще не пробовал синхронно, а по остановкам, скажем, у меня есть файл размером в 11 КБ, в моей очереди, в качестве первого файла, нет явной прогрессии загрузки за пределами 11 КБ-1. Он не рассматривает, что файл закончен, ergo, ни один из других загрузок не продвигается. Я попытаюсь загрузить журнал, когда вернусь в свою систему завтра. Обратите внимание: если я сказал скачать здесь, это потому, что мой мозг запутан. Все такие экземпляры могут быть заменены загрузкой. –
Немного не по теме из вашего вопроса, но вы не должны проверять 'InvokeRequired' для каждого элемента управления. Проверьте его один раз, затем сделайте все обновление одного и того же оператора 'If'. Вы можете просто проверить «Me.InvokeRequired», поскольку вызов всегда будет выполняться текущей формой (то есть, даже если вы вызываете 'yourControl.Invoke()'). –