Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
Hozzon létre egy WPF-alkalmazást, és nevezze el.
AsyncWarningA 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.
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.
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.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.