title: How to write an Async Sub in VB.NET?
body: <pre><code>Public Class LoginManager
      Implements ILoginManager
      Private ReadOnly _iLoginRepository As ILoginRepository
      Public Sub New()
          _iLoginRepository = New LoginRepository()
      End Sub
  
      Public Async Sub InsertFailedLoginAttempt(failedLoginAttempt As FailedLogin) Implements ILoginManager.InsertFailedLoginAttempt
          'Example of the S in Solid (Single Repsonsibilty)
          'Need to call these method async. But await errors 
              _iLoginRepository.InsertFailedLoginAttemptAsync(failedLoginAttempt)
              _iLoginRepository.InsertFailedLoginAttemptIntoLoginMasterAsync(failedLoginAttempt)
          End Sub
      End Class
  </code></pre>
  
  <p>Repsoitory Interface:</p>
  
  <pre><code>Public Interface ILoginRepository
      Function IsUserAuthenticatedAsync(ByVal cID As String, ByVal password As String, ByVal IsExternalUser As Boolean) As Task(Of Boolean)
      Sub InsertFailedLoginAttemptAsync(ByVal failedLoginAttempt As FailedLogin)
      Sub InsertFailedLoginAttemptIntoLoginMasterAsync(ByVal failedLoginAttempt As FailedLogin)
  
  End Interface
  </code></pre>
  
  <p>Repository Implementation:</p>
  
  <pre><code>Public Class LoginRepository
      Implements ILoginRepository
      Public ReadOnly _applicationDBContext As New ApplicationDBContext()
  
      Public Async Sub InsertFailedLoginAttemptAsync(failedLoginAttempt As FailedLogin) Implements ILoginRepository.InsertFailedLoginAttemptAsync
          Using _applicationDBContext
              _applicationDBContext.RepFailedLogins.Add(failedLoginAttempt)
              Await _applicationDBContext.SaveChangesAsync()
          End Using
      End Sub
  
      Public Async Sub InsertFailedLoginAttemptIntoLoginMasterAsync(failedLoginAttempt As FailedLogin) Implements ILoginRepository.InsertFailedLoginAttemptIntoLoginMasterAsync
          Using _applicationDBContext
              _applicationDBContext.RepFailedLoginMasters.Add(failedLoginAttempt)
              Await _applicationDBContext.SaveChangesAsync()
          End Using
      End Sub
  
      ''' &lt;summary&gt;
      ''' Determine whether a user is authenticated, be it an internal or external user
      ''' I have condensed two methods into one
      ''' &lt;/summary&gt;
      ''' &lt;param name="cID"&gt;&lt;/param&gt;
      ''' &lt;param name="password"&gt;&lt;/param&gt;
      ''' &lt;param name="IsExternalUser"&gt;&lt;/param&gt;
      ''' &lt;returns&gt;&lt;/returns&gt;
      Public Async Function IsUserAuthenticatedAsync(cID As String, password As String, IsExternalUser As Boolean) As Task(Of Boolean) Implements ILoginRepository.IsUserAuthenticatedAsync
          If (IsExternalUser And String.IsNullOrEmpty(password)) Then
              Throw New ArgumentNullException("External user requires password")
          End If
  
          Dim user As Chaser
          Dim toRet As Boolean
  
          Using _applicationDBContext
              'Two ways to use LINQ
              'First is LINQ Lambda sybntax(little harder to read)
              user = Await _applicationDBContext.Chasers.Where(Function(x) x.CID = cID).FirstOrDefaultAsync()
  
              'Second is LINQ Query syntax(looks more like SQL just more verbose
              'user = From x In _applicationDBContext.Chasers
              '       Where x.CID = cID
              '       Select x
          End Using
  
          If IsNothing(user) Then
              toRet = False
          ElseIf Not IsExternalUser And Not IsNothing(user) Then
              toRet = True
          ElseIf IsExternalUser And user.Hash_Password = password Then
              toRet = True
          End If
  
          Return toRet
      End Function
  End Class
  </code></pre>
  
  <p>I'm trying to call the <code>InsertFailedLoginAttemptAsync</code> repository method in my manager. It is an async method but I am unable to await the method. How can I make this method awaitable?</p>
  
  <p>I believe it has something to do with the interface and not making it an async method like in C# but I'm unable to do this.</p>