title: Async and Await, why two return values
body: <p>I'm trying to get my head around <code>Async and Await</code>. It's going well but one thing I would like clarification on is why there are two return statements in my method. I'm really looking for an explanation of what is actually happening behind the scenes.</p>
  
  <p>I'll post the full code below as it only amounts to around 80 lines. I'm talking about the central method <code>AllSubfolderFiles</code>, which has both <code>Return counter</code> and <code>Return dirsFraction</code>. What's actually happening with these?</p>
  
  <p>Basically, it is a WinForm application that iterates all the files of subfolders, updating a ProgressBar for each iterated subfolder.</p>
  
  <pre><code>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 &gt; 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
  </code></pre>
  
  <p>My assessment is that <code>counter</code> is returned and then marshalled back onto the UI thread as <code>dirsFraction</code>, but I'm not convinced by my attempted explanation.</p>
  
  <p><a href="https://i.stack.imgur.com/RcKSn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RcKSn.png" alt="enter image description here"></a></p>