Async dan Tunggu, mengapa dua nilai kembalian

Saya mencoba memahami Async and Await. Ini berjalan dengan baik tetapi satu hal yang saya ingin klarifikasi adalah mengapa ada dua pernyataan pengembalian dalam metode saya. Saya benar-benar mencari penjelasan tentang apa yang sebenarnya terjadi di balik layar.

Saya akan memposting kode lengkapnya di bawah ini karena hanya berjumlah sekitar 80 baris. Saya sedang berbicara tentang metode sentral AllSubfolderFiles, yang memiliki Return counter dan Return dirsFraction. Apa yang sebenarnya terjadi dengan ini?

Pada dasarnya, ini adalah aplikasi WinForm yang mengulangi semua file subfolder, memperbarui ProgressBar untuk setiap subfolder yang diulang.

Imports System.IO

Public Class frmAsyncProgress

    Private Sub frmAsyncProgress_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        barFileProgress.Minimum = 0
        barFileProgress.Maximum = 100
        btnCancel.Enabled = False
    End Sub

    Private Async Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        If String.IsNullOrWhiteSpace(txtPath.Text) Then
            MessageBox.Show("Provide a location first.", "Location")
            Exit Sub
        End If
        Dim sLocation As String = txtPath.Text.Trim()
        If Not Directory.Exists(sLocation) Then
            MessageBox.Show("Directory doesn't exist.", "Location")
            Exit Sub
        End If

        Dim progressIndicator = New Progress(Of Integer)(AddressOf UpdateProgress)
        btnStart.Enabled = False
        btnCancel.Enabled = True
        lblPercent.Text = "0%"

        Dim allFiles As Integer = Await AllSubfolderFiles(sLocation, progressIndicator)
        Debug.WriteLine(allFiles.ToString())        'the number of subfolders iterated
        btnStart.Enabled = True
        btnCancel.Enabled = False
    End Sub

    Private Async Function AllSubfolderFiles(location As String, progress As IProgress(Of Integer)) As Task(Of Integer)
        Dim dirsTotal As Integer = Directory.GetDirectories(location).Length
        Dim dirsFraction As Integer = Await Task(Of Integer).Run(Function()
                                                                     Dim counter As Integer = 0
                                                                     For Each subDir As String In Directory.GetDirectories(location)
                                                                         SubfolderFiles(subDir)
                                                                         counter += 1
                                                                         If progress IsNot Nothing Then
                                                                             progress.Report(counter * 100 / dirsTotal)
                                                                         End If
                                                                     Next

                                                                     Return counter
                                                                 End Function)
        Return dirsFraction
    End Function

    Private Sub UpdateProgress(value As Integer)
        barFileProgress.Value = value
        lblPercent.Text = (value / 100).ToString("#0.##%")
    End Sub

    Private Sub SubfolderFiles(location As String)
        'source: http://stackoverflow.com/questions/16237291/visual-basic-2010-continue-on-error-unauthorizedaccessexception#answer-16237749

        Dim paths = New Queue(Of String)()
        Dim fileNames = New List(Of String)()

        paths.Enqueue(location)

        While paths.Count > 0
            Dim sDir = paths.Dequeue()

            Try
                Dim files = Directory.GetFiles(sDir)
                For Each file As String In Directory.GetFiles(sDir)
                    fileNames.Add(file)
                Next

                For Each subDir As String In Directory.GetDirectories(sDir)
                    paths.Enqueue(subDir)
                Next
            Catch ex As UnauthorizedAccessException
                ' log the exception or ignore it
                Debug.WriteLine("Directory {0}  could not be accessed!", sDir)
            Catch ex As Exception
                ' log the exception or ...
                Throw
            End Try
        End While
        'could return fileNames collection
    End Sub
End Class

Penilaian saya adalah bahwa counter dikembalikan dan kemudian disusun kembali ke thread UI sebagai dirsFraction, tapi saya tidak yakin dengan upaya penjelasan saya.

masukkan deskripsi gambar di sini


person Andy G    schedule 14.02.2016    source sumber


Jawaban (1)


Di dalam fungsi AllSubfolderFiles, Anda memanggil Task.Run dan meneruskan fungsi anonim yang kembali dengan Return counter. AllSubfolderFiles menunggu hasil panggilan itu dan kemudian kembali dengan Return dirsFraction.

Jadi, Anda memiliki 2 pengembalian dalam fungsi yang sama karena Anda memiliki fungsi anonim di dalam fungsi asli Anda. Anda dapat memindahkan fungsi tersebut ke fungsi bernama sendiri yang akan memperjelas bahwa ada 2 fungsi berbeda di sini.

person i3arnon    schedule 14.02.2016
comment
Terima kasih banyak, itu masuk akal (saya hampir sampai;)). - person Andy G; 14.02.2016