Fabio Rameiro
Fabio Rameiro

Reputation: 45

Wait until download is complete before starting other tasks

I am trying to download a file, and then run some adb commands. However when downloading, i could not get it to update the progress bar using

downloadFile(url,filename)` command.

A bit of searching it said that the command was blocking the UI thread, so i decided to use Task.Run() (a solution to my previous post to run ADB Commands when it blocked the UIThread).

This made no difference. Another solution that i found is to use

downloadFileAsync(url, filename)

The progress bar is updating!

But, the ADB commands are running before the file is downloaded! They are declared after, but they are still being run before the file is downloaded, which I don't want.

Here is the code:

Private Sub btnFlashRecovery_Click(sender As Object, e As EventArgs) Handles btnFlashRecovery.Click
                    'Insert ommited Code here (removed to simplify question) 
                    'id is variable obtained from a previous code that was ommited here        
                    Dim fileName As String = "downloads/twrp-" & id & ".img"
                    DownloadFile(url, fileName)

                    'run the right commands

                    LabelToOutput = txtBoxRecovery
                    Dim commands(3, 3) As String
                    commands = {{"adb", "reboot bootloader", "Rebooting to bootloader"},
                                            {"fastboot", "flash recovery" & "downloads/twrp-3.1.1-0.img", "Flashing recovery: (make sure device is plugged, otherwise it will not output anything)"},
                                            {"fastboot", "reboot", "Rebooting device"}

                                        }
                    'Task to run after
                    Task.Run(Sub() runComands(commands))


End Sub

Private Sub UpdateProgressBar(ByVal a As Integer)
    If Me.InvokeRequired Then
        Dim args() As String = {a}
        Me.Invoke(New Action(Of String)(AddressOf UpdateProgressBar), args)
        Return
    End If
    ProgressBar1.Value = CInt(a)

End Sub

Public Sub DownloadFile(urlAddress As String, location As String)
    Using webClient = New WebClient()
        AddHandler webClient.DownloadFileCompleted, AddressOf Completed
        AddHandler webClient.DownloadProgressChanged, AddressOf ProgressChanged



        Try
            ' Start downloading the file

            webClient.DownloadFileAsync(New Uri(urlAddress), location)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Using

End Sub

' The event that will fire whenever the progress of the WebClient is changed
Private Sub ProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)

    'Console.WriteLine(e.ProgressPercentage)
    ' Update the progressbar percentage only when the value is not the same.
    UpdateProgressBar(e.ProgressPercentage)



End Sub

' The event that will trigger when the WebClient is completed
Private Sub Completed(sender As Object, e As AsyncCompletedEventArgs)


    If e.Cancelled = True Then
        MessageBox.Show("Download has been canceled.")
    Else
        MessageBox.Show("Download completed!")
    End If
End Sub

Upvotes: 2

Views: 1374

Answers (1)

Joel Coehoorn
Joel Coehoorn

Reputation: 415840

Do it like this:

'Need Async keyword with the method
Private Async Sub btnFlashRecovery_Click(sender As Object, e As EventArgs) Handles btnFlashRecovery.Click
    'Insert ommited Code here (removed to simplify question) 

    'id is variable obtained from a previous code that was ommited here        
     Dim fileName As String = "downloads/twrp-" & id & ".img"
    'You need to AWAIT the result of the task
     Await Task.Run(Sub() DownloadFile(url, fileName))

    'run the right commands
    LabelToOutput = txtBoxRecovery
    Dim commands(3, 3) As String
    commands = { {"adb", "reboot bootloader", "Rebooting to bootloader"},
                 {"fastboot", "flash recovery" & "downloads/twrp-3.1.1-0.img", "Flashing recovery: (make sure device is plugged, otherwise it will not output anything)"},
                 {"fastboot", "reboot", "Rebooting device"}
               }
    'Task to run after
    'Await here, too, to allow the UI to remain responsive
    Await Task.Run(Sub() runComands(commands))
End Sub

Upvotes: 1

Related Questions