Загрузка API Dropbox Ожидание асинхронной функции - PullRequest
0 голосов
/ 10 июля 2020

ребята

У меня проблемы с Dropbox API при загрузке. У меня есть список файлов, и на каждом проходе for я вызываю функцию, которая загружает:

Public Function Upload(ByVal ArquivoOrigem As String, ByVal ArquivoDestino As String)

    Try

        Dim fileStream As FileStream = New FileStream(ArquivoOrigem, FileMode.Open)

        Me.CtrlTask = Task.Run(Function() Upload_Executar(fileStream, ArquivoDestino))
        Me.CtrlTask.Wait()

    Catch ex As Exception

    End Try

End Function

Private Async Function Upload_Executar(ByVal fileStream As FileStream, ByVal ArquivoDestino As String) As Task

    Me.ArquivoUploadIs = False

    Try

        Dim numChunks As Integer = CInt(Math.Ceiling(CDbl(fileStream.Length) / Me.chunkSize))
        Dim buffer As Byte() = New Byte(Me.chunkSize - 1) {}
        Dim sessionId As String = Nothing

        Console.WriteLine("Chunk upload file...")
        Console.WriteLine("fileStream.Length: " + fileStream.Length.ToString())
        Console.WriteLine("chunkSize: " + Me.chunkSize.ToString())
        Console.WriteLine("numChunks: " + numChunks.ToString())

        For idx = 0 To numChunks - 1

            Dim Porc1 As Integer = 0
            Dim Porc2 As Integer = 0

            Porc1 = CInt((idx / numChunks) * 100)
            Porc2 = idx * Me.chunkSize

            Console.WriteLine("Posicao: " + idx.ToString() + " / Total: " + numChunks.ToString() + " / Porc1: " + Porc1.ToString() + " / Total Transferido: " + FormatBytes(Porc2) + " / Tamanho Total: " + FormatBytes(fileStream.Length))

            Dim byteRead = fileStream.Read(buffer, 0, Me.chunkSize)

            Using memStream As MemoryStream = New MemoryStream(buffer, 0, byteRead)

                If idx = 0 Then

                    Console.WriteLine("memStream.Length: " + memStream.Length.ToString())
                    Console.WriteLine("UploadSessionStartAsync")

                    Dim result = Await Dbx.Files.UploadSessionStartAsync(False, memStream)

                    Console.WriteLine(result)

                    sessionId = result.SessionId

                    Console.WriteLine("sessionId: " + sessionId)

                Else

                    Dim cursor As UploadSessionCursor = New UploadSessionCursor(sessionId, CULng((Me.chunkSize * idx)))

                    If idx = numChunks - 1 Then

                        Console.WriteLine("UploadSessionFinishAsync")

                        Dim CtrlUp = Await Dbx.Files.UploadSessionFinishAsync(cursor, New CommitInfo(ArquivoDestino), memStream)

                        If CtrlUp.Id <> "" Then

                            Me.ArquivoUploadIs = True

                        End If

                    Else

                        Console.WriteLine("UploadSessionAppendV2Async")

                        Await Dbx.Files.UploadSessionAppendV2Async(cursor, body:=memStream)

                    End If

                End If

            End Using

        Next

    Catch ex As Exception

        ShowMsgError(ex)

    End Try

End Function

И я вызываю ее через задачу, используя "wait", чтобы дождаться отправки в fini sh перед переходом к следующему файлу:

Upload("C:\Arq1.pdf", "/Arq1.pdf");
Upload("C:\Arq2.pdf", "/Arq2.pdf");
Upload("C:\Arq3.pdf", "/Arq3.pdf");
Upload("C:\Arq4.pdf", "/Arq4.pdf");

Однако, пока загрузка завершена, приложение зависает. Однако, чтобы проверить, поместите поток, это приводит к одновременной отправке всех файлов в моем списке, и я хочу отправить один, дождаться его завершения sh, а затем отправить следующий.

Есть ли у кого-нибудь предложения?

1 Ответ

0 голосов
/ 12 июля 2020

Следует избегать использования .Wait, поскольку это может вызвать взаимоблокировки.

Public Async Function Upload(ByVal ArquivoOrigem As String, ByVal ArquivoDestino As String) As Task
    Try
        Dim fileStream As FileStream = New FileStream(ArquivoOrigem, FileMode.Open)

        Await Upload_Executar(fileStream, ArquivoDestino))
    Catch ex As Exception

    End Try
End Function
Await Upload("C:\Arq1.pdf", "/Arq1.pdf");
Await Upload("C:\Arq2.pdf", "/Arq2.pdf");
Await Upload("C:\Arq3.pdf", "/Arq3.pdf");
Await Upload("C:\Arq4.pdf", "/Arq4.pdf");
...