Dropbox API上传等待异步功能

时间:2020-07-10 20:17:20

标签: vb.net dropbox-api

我在使用Dropbox API时遇到问题。 我有一个文件列表,在每次传递的过程中,我都调用上载的函数:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.js" integrity="sha512-nxKp6INemMtUWHV+BToAOXm2ZV4+LCc/sw+4j2fyVJG088hHf7Rt/h8qCYT7bTsEtqkDCXo6sbtFlkro3Zo3HA==" crossorigin="anonymous"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> 
</head>
<body>
    <!----          Start Data Input for Flyer          ---->
    <div class="container" style="margin-bottom: 10px;">
    <div class="jumbotron"><h1>San Antonio Pet Rescue</h1>
        <p>locating lost and found/stray, dogs and cats</p>
        </div>
        <div class="row">
           <div class="col-sm">Insert Your Title Here<input type="text" id="title_input" name="title_input" placeholder="Title"></div>
           <div class="col-sm">Contact Name<input type="text" id="con_name_input" name="con_name_input" placeholder="Contact Name"></div>
           <div class="col-sm">Contact Phone<input class="phone_us" type="tel" id="phone_input" name="phone_input" placeholder="xxx-xxx-xxxx"></div>
           <div  class="col-sm">Contact Email<input type="email" id="email_input" name="email_input" placeholder="Contact Email"></div>
        </div>
        <div class="row">
         <div  class="col-sm">Animal Name if Known<input type="text" id="name_animal_input" name="name_animal_input" placeholder="ex: Duke, Gracie, Ben, Unknown"></div>
        <div class="col-sm">Date Found/Lost<input type="date" id="date_lost_input" name="date_lost_input"></div>
         <div class="col-sm">Predominate Color<input type="text" id="color_input" name="color" placeholder="ex: Black, Rust, Black and White, Dark Brown..."></div>
         <div class="col-sm">Breed of Animal<input type="text" id="breed_input" name="breed_input" placeholder="ex: Calico, Doberman, Apaloossa..."></div>
             </div>
            <div class="row">
         <div class="col-3 col-sm">Lost/Found<input type="radio" id="lost" name="lost_input" value="Lost">Lost&nbsp;<input type="radio" id="found" name="lost_input" value="Found">Found</div>
         <fieldset class="form-group">
    <div class="row">
      <div><legend class="col-form-label col-sm-2 pt-0">Sex</legend></div>
      <div class="col-sm-10">
        <div class="form-check">
          <input class="form-check-input" type="radio" name="sex_input" id="male" value="Male" checked>
          <label class="form-check-label" for="male">
            Male
          </label>
        </div>
        <div class="col-2 form-check">
          <input class="form-check-input" type="radio" name="sex_input" id="female" value="Female">
          <label class="form-check-label" for="female">
            Female
          </label>
        </div>
      </div>
    </div>
  </fieldset>
         <div class="col-2 col-sm">Microchipped<input type="radio" id="micro_input" name="micro_input" value="Yes">Yes&nbsp;<input type="radio" name="micro" value="No">No&nbsp;<input type="radio" name="micro" value="Unknown">Unknown</div>
                </div>
        <div class="row">
           
           <div class="col-sm col-6"><label>Add description here</label><textarea id="description_input" name="description_input" placeholder="Identifying Markings and Features, limit 316 characters including spaces
(Note: For found animals, you may want to withold specific details in order to screen for the animal's owner)" wrap="virtual" rows="10" cols="45"></textarea></div>
        <div class="col-sm col-5"><label>Select Your Picture Here</label><input type="file" /></div>
            </div>
        <div class="row">
        <div class="col-sm col-12" style="background-color: #e9ecef">Program sponsored by, Bruce Osborne, your JBGoodwin REALTORS for home sales & purchases and Apartment Leases.
For every home purchased or apartment leased through your referrals to Bruce, he will donate $50 to the pet rescue of your choice.</div>
        </div>
</div> <!----          Container, Main          ---->
    <!----          Start Flyer Rendering          ---->
    <div class="container" style="border: dashed; height: 1200px; width: 1571px">
        <div class="row">
        <div class="h2 text-center" style="margin: 10px;">SA Pet Rescue</div>
        </div>
        <div class="row">
            <div class="h5 text-center" style="margin: 10px;">locating lost and found/stray, dogs and cats</div>
        </div>
        <div class="container-md h1 text-center" id="title"></div>
        <div class="container-md h1 text-center" id="preview"><img id="myImg" src="#" alt="your image here" width="700" height="400"></div> <!----    Display image    ---->
        <div class="row container-md">
        <div class="col-4 container-md h3 text-center" id="con_name"></div> 
        <div class="col-4 container-md h3 text-center" id="phone"></div>
        <div class="col-4 container-md h3 text-center" id="email"></div>
        </div>
        <div class="row">
        <div class="col-2 container-md h5 text-center" id="animal_name"></div>
        <div class="col-2 container-md h5 text-center">Microchipped&nbsp;<span id="micro"></span></div>
        <div class="col-2 container-md h5 text-center" id="sex"></div>
        <div class="col-2 container-md h5 text-center" id="breed"></div>
        <div class="col-2 container-md h5 text-center" id="color"></div>
        <div class="col-2 container-md h5 text-center"><span id="lost_found"></span>&nbsp;On&nbsp;<span id="date_lost"></span></div>
        </div>
        <div class="container-md h3 text-center" id="description"></div>
        <div class="container-fluid">
            <div class="col-xs-9">
            <div class="row main-row">
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            <div class="rotate">
                <div class="h5 tearoff"><span class="tear_off_data"></span></div></div>
            </div>
            </div>
        </div>
      </div>
    <div class="container my-5"></div>
</body>
    <script src="flyer-text.js"></script>
    <script type="text/jscript">
    window.addEventListener('load', function() {
  document.querySelector('input[type="file"]').addEventListener('change', function() {
    if (this.files && this.files[0]) {
      var img = document.querySelector('img'); // $('img')[0]
      img.src = URL.createObjectURL(this.files[0]); // set src to file url
    }
  });
});
    </script>
</html>

我通过任务叫她,使用“ wait”等待提交完成,然后再转到下一个文件:

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

但是,上传完成后,应用程序被卡住了。 但是,要测试放置一个线程,这会导致同时发送列表中的所有文件,并且我想发送一个文件,等待它完成后再发送下一个文件。

有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您应避免使用.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");