首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dropbox API上传等待异步函数

Dropbox API上传等待异步函数
EN

Stack Overflow用户
提问于 2020-07-11 04:17:21
回答 1查看 177关注 0票数 0

伙计们

我在上传Dropbox API时遇到了困难。我有一个文件列表,在for的每一次传递中,我都会调用上传的函数:

代码语言:javascript
运行
复制
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“等待提交完成,然后转到下一个文件:

代码语言:javascript
运行
复制
Upload("C:\Arq1.pdf", "/Arq1.pdf");
Upload("C:\Arq2.pdf", "/Arq2.pdf");
Upload("C:\Arq3.pdf", "/Arq3.pdf");
Upload("C:\Arq4.pdf", "/Arq4.pdf");

然而,当上传完成时,应用程序被卡住了。然而,为了测试put线程,这会导致列表中的所有文件同时发送,我想发送一个,等待它完成,然后发送下一个文件。

有人有什么建议吗?

EN

Stack Overflow用户

发布于 2020-07-12 19:56:00

您应该避免使用.Wait,因为它可能会导致死锁。

代码语言:javascript
运行
复制
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
代码语言:javascript
运行
复制
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");
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62841719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档