BC42358: Eftersom det här anropet inte väntar fortsätter körningen av den aktuella metoden innan anropet har slutförts

Eftersom det här anropet inte väntar fortsätter körningen av den aktuella metoden innan anropet har slutförts. Överväg att tillämpa operatorn Await på resultatet av anropet.

Den aktuella metoden anropar en asynkron metod som returnerar en Task eller en Task<TResult> och som inte tillämpar Await-operatorn på resultatet. Anropet till asynkron metod startar en asynkron uppgift. Men eftersom ingen Await operator tillämpas fortsätter programmet utan att vänta på att aktiviteten ska slutföras. I de flesta fall är det beteendet inte förväntat. Vanligtvis beror andra aspekter av anropsmetoden på resultatet av anropet eller, minimalt, den anropade metoden förväntas slutföras innan du återvänder från metoden som innehåller anropet.

Ett lika viktigt problem är vad som händer med undantag som tas upp i den så kallade async-metoden. Ett undantag som genereras i en metod som returnerar en Task eller Task<TResult> lagras i den returnerade aktiviteten. Om du inte väntar på uppgiften eller uttryckligen söker efter undantag går undantaget förlorat. Om du väntar på uppgiften är dess undantag återväxt.

Som bästa praxis bör du alltid invänta samtalet.

Som standard är det här meddelandet en varning. Mer information om hur du döljer varningar eller behandlar varningar som fel finns i Konfigurera varningar i Visual Basic.

Fel-ID: BC42358

Så här åtgärdar du den här varningen

Du bör endast överväga att ignorera varningen om du är säker på att du inte vill vänta tills det asynkrona anropet har slutförts och att den anropade metoden inte genererar några undantag. I så fall kan du ignorera varningen genom att tilldela aktivitetsresultatet för anropet till en variabel.

I följande exempel visas hur du orsakar varningen, hur du undertrycker den och hur du väntar på anropet:

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

I exemplet, om du väljer Samtal #1 eller Samtal #2, avslutas den asynkrona asynkrona metoden (CalledMethodAsync) när både anroparen (CallingMethodAsync) och anroparens anropare (StartButton_Click) har slutförts. Den sista raden i följande utdata visar dig när den anropade metoden är klar. Post till och avsluta från händelsehanteraren som anropar CallingMethodAsync i det fullständiga exemplet markeras i utdata.

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.

Exempel

Följande WPF-program (Windows Presentation Foundation) innehåller metoderna från föregående exempel. Följande steg konfigurerar programmet:

  1. Skapa ett WPF-program och ge det AsyncWarningnamnet .

  2. I Visual Studio Code-redigeraren väljer du fliken MainWindow.xaml .

    Om fliken inte visas öppnar du snabbmenyn för MainWindow.xaml i Solution Explorer och väljer sedan Visa kod.

  3. Ersätt koden i XAML-vyn i MainWindow.xaml med följande kod:

    <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>
    

    Ett enkelt fönster som innehåller en knapp och en textruta visas i designvyn för MainWindow.xaml.

    Mer information om XAML Designer finns i Skapa ett användargränssnitt med XAML Designer. Information om hur du skapar ett eget enkelt användargränssnitt finns i avsnitten "Så här skapar du ett WPF-program" och "Så här utformar du en enkel WPF MainWindow"-avsnitt i Genomgång: Åtkomst till webben med hjälp av Async och Await.

  4. Ersätt koden i MainWindow.xaml.vb med följande kod.

    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. Välj F5-tangenten för att köra programmet och välj sedan knappen Start .

    Förväntade utdata visas i slutet av koden.

Se även