Delen via


BC42358: Omdat deze aanroep niet wordt gewacht, gaat de uitvoering van de huidige methode door voordat de aanroep is voltooid

Omdat deze aanroep niet wordt gewacht, wordt de uitvoering van de huidige methode voortgezet voordat de aanroep is voltooid. Overweeg de Await operator toe te passen op het resultaat van de aanroep.

De huidige methode roept een asynchrone methode aan die een Task of a Task<TResult> retourneert en de await-operator niet op het resultaat toepast. De aanroep van de asynchrone methode start een asynchrone taak. Omdat er echter geen Await operator wordt toegepast, wordt het programma voortgezet zonder te wachten tot de taak is voltooid. In de meeste gevallen wordt dat gedrag niet verwacht. Meestal zijn andere aspecten van de aanroepmethode afhankelijk van de resultaten van de aanroep of, minimaal, wordt verwacht dat de aangeroepen methode wordt voltooid voordat u terugkeert van de methode die de aanroep bevat.

Een even belangrijk probleem is wat er gebeurt met uitzonderingen die worden gegenereerd in de zogenaamde asynchrone methode. Een uitzondering die wordt gegenereerd in een methode die een Task of Task<TResult> meer retourneert in de geretourneerde taak. Als u niet op de taak wacht of expliciet op uitzonderingen controleert, gaat de uitzondering verloren. Als u de taak wacht, wordt de uitzondering opnieuw gestart.

Als best practice moet u altijd wachten op het gesprek.

Dit bericht is standaard een waarschuwing. Zie Waarschuwingen configureren in Visual Basic voor meer informatie over het verbergen van waarschuwingen of het behandelen van waarschuwingen als fouten.

Fout-id: BC42358

Deze waarschuwing oplossen

Overweeg de waarschuwing alleen te onderdrukken als u zeker weet dat u niet wilt wachten tot de asynchrone aanroep is voltooid en dat de aangeroepen methode geen uitzonderingen genereert. In dat geval kunt u de waarschuwing onderdrukken door het taakresultaat van de aanroep aan een variabele toe te wijzen.

In het volgende voorbeeld ziet u hoe u de waarschuwing veroorzaakt, hoe u deze onderdrukt en hoe u wacht op de oproep:

Async Function CallingMethodAsync() As Task

    ResultsTextBox.Text &= vbCrLf & "  Entering calling method."

    ' Variable delay is used to slow down the called method so that you
    ' can distinguish between awaiting and not awaiting in the program's output.
    ' You can adjust the value to produce the output that this topic shows
    ' after the code.
    Dim delay = 5000

    ' Call #1.
    ' Call an async method. Because you don't await it, its completion isn't
    ' coordinated with the current method, CallingMethodAsync.
    ' The following line causes the warning.
    CalledMethodAsync(delay)

    ' Call #2.
    ' To suppress the warning without awaiting, you can assign the
    ' returned task to a variable. The assignment doesn't change how
    ' the program runs. However, the recommended practice is always to
    ' await a call to an async method.
    ' Replace Call #1 with the following line.
    'Task delayTask = CalledMethodAsync(delay)

    ' Call #3
    ' To contrast with an awaited call, replace the unawaited call
    ' (Call #1 or Call #2) with the following awaited call. The best
    ' practice is to await the call.

    'Await CalledMethodAsync(delay)

    ' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync
    ' continues to run and, in this example, finishes its work and returns
    ' to its caller.
    ResultsTextBox.Text &= vbCrLf & "  Returning from calling method."
End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

    ResultsTextBox.Text &= vbCrLf & "    Entering called method, starting and awaiting Task.Delay."
    ' Slow the process down a little so you can distinguish between awaiting
    ' and not awaiting. Adjust the value for howLong if necessary.
    Await Task.Delay(howLong)
    ResultsTextBox.Text &= vbCrLf & "    Task.Delay is finished--returning from called method."
End Function

Als u in het voorbeeld Oproep #1 of Gesprek #2 kiest, wordt de niet-geopende asynchrone methode (CalledMethodAsync) voltooid nadat zowel de aanroeper (CallingMethodAsync) als de beller () van de beller (StartButton_Click) zijn voltooid. In de laatste regel in de volgende uitvoer ziet u wanneer de aangeroepen methode is voltooid. Vermelding van en uitgang van de gebeurtenis-handler die in het volledige voorbeeld wordt aanroepen CallingMethodAsync , worden gemarkeerd in de uitvoer.

Entering the Click event handler.
  Entering calling method.
    Entering called method, starting and awaiting Task.Delay.
  Returning from calling method.
Exiting the Click event handler.
    Task.Delay is finished--returning from called method.

Opmerking

De volgende WpF-toepassing (Windows Presentation Foundation) bevat de methoden uit het vorige voorbeeld. Met de volgende stappen stelt u de toepassing in:

  1. Maak een WPF-toepassing en geef deze AsyncWarningeen naam.

  2. Kies in de Visual Studio Code-editor het tabblad MainWindow.xaml .

    Als het tabblad niet zichtbaar is, opent u het snelmenu voor MainWindow.xaml in Solution Explorer en kiest u Code weergeven.

  3. Vervang de code in de XAML-weergave van MainWindow.xaml door de volgende code:

    <Window x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button x:Name="StartButton" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold" FontFamily="Aharoni" Click="StartButton_Click" />
            <TextBox x:Name="ResultsTextBox" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida Console"/>
        </Grid>
    </Window>
    

    Een eenvoudig venster met een knop en een tekstvak wordt weergegeven in de ontwerpweergave van MainWindow.xaml.

    Zie Een gebruikersinterface maken met behulp van XAML Designer voor meer informatie over de XAML Designer. Zie de secties 'Een WPF-toepassing maken' en 'Een eenvoudige WPF MainWindow ontwerpen' van Walkthrough: Het web openen met behulp van Async en Await voor meer informatie over het bouwen van uw eigen eenvoudige gebruikersinterface.

  4. Vervang de code in MainWindow.xaml.vb door de volgende code.

    Class MainWindow
    
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
    
            ResultsTextBox.Text &= vbCrLf & "Entering the Click event handler."
            Await CallingMethodAsync()
            ResultsTextBox.Text &= vbCrLf & "Exiting the Click event handler."
        End Sub
    
        Async Function CallingMethodAsync() As Task
    
            ResultsTextBox.Text &= vbCrLf & "  Entering calling method."
    
            ' Variable delay is used to slow down the called method so that you
            ' can distinguish between awaiting and not awaiting in the program's output.
            ' You can adjust the value to produce the output that this topic shows
            ' after the code.
            Dim delay = 5000
    
            ' Call #1.
            ' Call an async method. Because you don't await it, its completion isn't
            ' coordinated with the current method, CallingMethodAsync.
            ' The following line causes the warning.
            CalledMethodAsync(delay)
    
            ' Call #2.
            ' To suppress the warning without awaiting, you can assign the
            ' returned task to a variable. The assignment doesn't change how
            ' the program runs. However, the recommended practice is always to
            ' await a call to an async method.
    
            ' Replace Call #1 with the following line.
            'Task delayTask = CalledMethodAsync(delay)
    
            ' Call #3
            ' To contrast with an awaited call, replace the unawaited call
            ' (Call #1 or Call #2) with the following awaited call. The best
            ' practice is to await the call.
    
            'Await CalledMethodAsync(delay)
    
            ' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync
            ' continues to run and, in this example, finishes its work and returns
            ' to its caller.
            ResultsTextBox.Text &= vbCrLf & "  Returning from calling method."
        End Function
    
        Async Function CalledMethodAsync(howLong As Integer) As Task
    
            ResultsTextBox.Text &= vbCrLf & "    Entering called method, starting and awaiting Task.Delay."
            ' Slow the process down a little so you can distinguish between awaiting
            ' and not awaiting. Adjust the value for howLong if necessary.
            Await Task.Delay(howLong)
            ResultsTextBox.Text &= vbCrLf & "    Task.Delay is finished--returning from called method."
        End Function
    
    End Class
    
    ' Output
    
    ' Entering the Click event handler.
    '   Entering calling method.
    '     Entering called method, starting and awaiting Task.Delay.
    '   Returning from calling method.
    ' Exiting the Click event handler.
    '     Task.Delay is finished--returning from called method.
    
    ' Output
    
    ' Entering the Click event handler.
    '   Entering calling method.
    '     Entering called method, starting and awaiting Task.Delay.
    '     Task.Delay is finished--returning from called method.
    '   Returning from calling method.
    ' Exiting the Click event handler.
    
  5. Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .

    De verwachte uitvoer wordt weergegeven aan het einde van de code.

Zie ook