Sdílet prostřednictvím


Protože toto volání není očekáváno, spouštění aktuální metody pokračuje před dokončením volání.

Chybová zpráva

Protože toto volání není očekáváno, vykonávání aktuální metody pokračuje před dokončením volání.Zvažte použití operátoru "Await" na výsledek volání.

Aktuální metoda volá asynchronní metody, která vrací Task nebo Task a se nevztahuje Await operátor výsledek.Spustí volání asynchronní metody asynchronní úkolu.Ale protože žádné Await je použit operátor, bude program pokračovat bez čekání na dokončení úlohy.Ve většině případů toto chování není očekáván.Obvykle jiných aspektů volání metody závisí na výsledky volání nebo minimální, volaná metoda očekává dokončení před vrácením z obsahujícího volání metody.

Stejně důležité je, co se stane s výjimkami jsou chována v asynchronní volané metody.Výjimku, která je aktivována v metodě, která vrací Task nebo Task je uložen ve vrácených úkolu.Pokud nechcete vyčkání úkolu nebo explicitně kontrolovat výjimky, dojde ke ztrátě výjimku.Pokud můžete očekávat úkolu, je jeho výjimka rethrown.

Jako nejlepší praxe by měla vždy očekávat volání.

Tato zpráva je ve výchozím nastavení upozornění.Další informace o skrytí upozornění nebo zpracovávající upozornění jako chyby, viz Konfigurace upozornění v jazyce Visual Basic.

ID chyby: BC42358

Pro vyřešení tohoto upozornění

  • Zvažte potlačení upozornění, pouze pokud jste si jisti, nechcete čekat na dokončení asynchronního volání, a že volaná metoda nevyvolá výjimky.V takovém případě můžete potlačit varování přiřazením úkolů výsledek volání proměnné.

    Následující příklad ukazuje, jak způsobit varování, jak ji potlačit a jak vyčkání 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
    

    V příkladu zvolíte # 1 volání nebo volání # 2, unawaited asynchronní metody (CalledMethodAsync) dokončen po obou jeho volajícího (CallingMethodAsync) a volající volajícího (StartButton_Click) jsou dokončeny.Poslední řádek následující výstup zobrazuje po dokončení volané metody.Vstupu a výstupu z obslužnou rutinu události zavolá CallingMethodAsync v plné příkladu označené ve výstupu.

    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 nastavení aplikace.

  1. Vytvořte WPF aplikace s názvem AsyncWarning.

  2. V aplikaci Visual Studio Editor kódu, zvolte MainWindow.xaml kartu.

    Pokud na kartě není zobrazeno, otevřete místní nabídku pro MainWindow.xaml v Aplikaci Solution Explorera pak zvolte Zobrazení kódu.

  3. Nahradit kód XAML zobrazení MainWindow.xaml s následující kód.

    <Window x:Class="MainWindow"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://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, které obsahuje tlačítko, textové pole se zobrazí v návrhu zobrazení MainWindow.xaml.

    Další informace o Návrhář XAML, viz Creating a UI by using XAML Designer.Informace o způsobu vytvoření jednoduchého rozhraní "vytvoření WPF aplikace" a "design jednoduché WPF MainWindow" části Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).

  4. Kód v MainWindow.xaml.vb nahraďte následující kód.

    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 spustit program a pak zvolte klávesu F5 Start tlačítko.

    Očekávaného výstupu se objeví na konci kód.

Viz také

Referenční dokumentace

Await – operátor (Visual Basic)

Koncepty

Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)