Megosztás:


BC42358: Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik

Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik. Fontolja meg az Await operátor alkalmazását a hívás eredményére.

Az aktuális metódus meghív egy aszinkron metódust, amely egy Task vagy egy Task<TResult> értéket ad vissza, és nem alkalmazza a Várakozás operátort az eredményre. Az aszinkron metódus hívása aszinkron feladatot indít el. Mivel azonban nincs Await operátor alkalmazva, a program a feladat befejezésére való várakozás nélkül folytatódik. A legtöbb esetben ez a viselkedés nem várható. A hívási módszer egyéb aspektusai általában a hívás eredményétől függenek, vagy minimálisan a hívott metódus várhatóan befejeződik, mielőtt visszatér a hívást tartalmazó metódusból.

Ugyanilyen fontos probléma, hogy mi történik az úgynevezett aszinkron metódusban felvetett kivételekkel. Olyan kivétel, amely olyan metódusban merül fel, amely visszaad egy Task vagy Task<TResult> a visszaadott tevékenységben tárolt értéket. Ha nem várja meg a feladatot, vagy kifejezetten nem ellenőrzi a kivételeket, a kivétel elveszik. Ha a feladatra vár, a kivétel újra meg fog jelenni.

Ajánlott eljárásként mindig várjon a hívásra.

Ez az üzenet alapértelmezés szerint figyelmeztetés. A figyelmeztetések elrejtésével vagy a figyelmeztetések hibákként való kezelésével kapcsolatos további információkért lásd: Figyelmeztetések konfigurálása a Visual Basicben.

Hibaazonosító: BC42358

A figyelmeztetés kezelése

A figyelmeztetést csak akkor érdemes mellőzni, ha biztos benne, hogy nem szeretné megvárni az aszinkron hívás befejezését, és hogy a hívott metódus nem emel kivételt. Ebben az esetben letilthatja a figyelmeztetést, ha hozzárendeli a hívás feladateredményét egy változóhoz.

Az alábbi példa bemutatja, hogyan okozhatja a figyelmeztetést, hogyan tilthatja el, és hogyan várhatja meg a hívást:

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

A példában, ha az 1. vagy a 2. hívás lehetőséget választja, a nem támogatott aszinkron metódus (CalledMethodAsync) befejeződik, miután a hívó (CallingMethodAsync) és a hívó (StartButton_Click) hívója is befejeződött. Az alábbi kimenet utolsó sora jelzi, hogy mikor fejeződik be a hívott metódus. A teljes példában hívható CallingMethodAsync eseménykezelőbe való belépés és kilépés a kimenetben lesz megjelölve.

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

Az alábbi Windows Presentation Foundation (WPF) alkalmazás az előző példában szereplő metódusokat tartalmazza. Az alkalmazás beállításának következő lépései:

  1. Hozzon létre egy WPF-alkalmazást, és nevezze el.AsyncWarning

  2. A Visual Studio Code Editorban válassza a MainWindow.xaml lapot.

    Ha a lap nem látható, nyissa meg a MainWindow.xaml helyi menüjét a Megoldáskezelőben, majd válassza a Kód megtekintése lehetőséget.

  3. Cserélje le a kódot a MainWindow.xaml XAML nézetében a következő kódra:

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

    Egy gombot és egy szövegdobozt tartalmazó egyszerű ablak jelenik meg a MainWindow.xaml Tervező nézetében.

    Az XAML Designerrel kapcsolatos további információkért lásd: Felhasználói felület létrehozása az XAML Designer használatával. A saját egyszerű felhasználói felület létrehozásáról a "WPF-alkalmazás létrehozása" és a "Egyszerű WPF MainWindow tervezése" című útmutató szakaszaiban talál további információt : A web elérése az Async és a Await használatával.

  4. Cserélje le a MainWindow.xaml.vb kódját a következő kódra.

    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. A program futtatásához válassza az F5 billentyűt, majd a Start gombot.

    A várt kimenet a kód végén jelenik meg.

Lásd még