Sdílet prostřednictvím


BC42358: Vzhledem k tomu, že toto volání není očekáváno, bude provádění aktuální metody pokračovat před dokončením volání.

Vzhledem k tomu, že toto volání není očekáváno, spuštění aktuální metody pokračuje před dokončením volání. Zvažte použití Await operátoru na výsledek volání.

Aktuální metoda volá asynchronní metodu Task , která vrací nebo Task<TResult> a a nepoužije operátor Await na výsledek. Volání asynchronní metody spustí asynchronní úlohu. Vzhledem k tomu, že není použit žádný Await operátor, program pokračuje bez čekání na dokončení úkolu. Ve většině případů se toto chování neočekává. Jiné aspekty volající metody jsou obvykle závislé na výsledcích volání, nebo se očekává, že volaná metoda bude dokončena dříve, než se vrátíte z metody, která obsahuje volání.

Stejně důležitý problém je to, co se stane s výjimkami, které jsou vyvolány volanou asynchronní metodou. Výjimka, která je vyvolána v metodě, která vrací nebo TaskTask<TResult> je uložena ve vrácené úloze. Pokud nečekáte na úkol nebo explicitně zkontrolujete výjimky, výjimka se ztratí. Pokud úkol čekáte, jeho výjimka se znovu zobrazí.

Osvědčeným postupem je vždy čekat na volání.

Ve výchozím nastavení je tato zpráva upozorněním. Další informace o skrytí upozornění nebo zacházení s upozorněními jako s chybami naleznete v tématu Konfigurace upozornění v jazyce Visual Basic.

ID chyby: BC42358

Pokud chcete toto upozornění vyřešit

Měli byste zvážit potlačení upozornění pouze v případě, že jste si jisti, že nechcete čekat na dokončení asynchronního volání a že volaná metoda nevyvolá žádné výjimky. V takovém případě můžete potlačit upozornění přiřazením výsledku úkolu volání proměnné.

Následující příklad ukazuje, jak způsobit upozornění, jak ho potlačit a jak očekávat volání:

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

Pokud v příkladu zvolíte Call #1 nebo Call #2, dokončí se asynchronní metoda (CalledMethodAsync) po dokončení volajícího (CallingMethodAsync) i volajícího (StartButton_Click). Poslední řádek v následujícím výstupu ukazuje, kdy se volá metoda dokončí. Vstup do obslužné rutiny události, která volá CallingMethodAsync v úplném příkladu, jsou ve výstupu označeny a ukončeny.

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.

Příklad

Následující aplikace Windows Presentation Foundation (WPF) obsahuje metody z předchozího příkladu. Následující kroky nastaví aplikaci:

  1. Vytvořte aplikaci WPF a pojmenujte ji AsyncWarning.

  2. V editoru Visual Studio Code zvolte kartu MainWindow.xaml .

    Pokud karta není viditelná, otevřete místní nabídku pro MainWindow.xaml v Průzkumník řešení a pak zvolte Zobrazit kód.

  3. Nahraďte kód v zobrazení XAML MainWindow.xaml následujícím kódem:

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

    Jednoduché okno obsahující tlačítko a textové pole se zobrazí v návrhovém zobrazení MainWindow.xaml.

    Další informace o návrháři XAML naleznete v tématu Vytvoření uživatelského rozhraní pomocí Návrháře XAML. Informace o tom, jak vytvořit vlastní jednoduché uživatelské rozhraní, naleznete v částech "Vytvoření aplikace WPF" a "Návrh jednoduché části WPF MainWindow" návodu : Přístup k webu pomocí Async a Await.

  4. Nahraďte kód v MainWindow.xaml.vb následujícím kódem.

    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. Zvolte klávesu F5, aby se program spustil, a pak zvolte tlačítko Start .

    Očekávaný výstup se zobrazí na konci kódu.

Viz také