async (C# referencia)
async
A módosító használatával megadhatja, hogy egy metódus, lambdakifejezés vagy névtelen metódus aszinkron-e. Ha ezt a módosítót egy metóduson vagy kifejezésen használja, akkor azt aszinkron metódusnak nevezzük. Az alábbi példa egy aszinkron metódust ExampleMethodAsync
határoz meg:
public async Task<int> ExampleMethodAsync()
{
//...
}
Ha még nem ismeri az aszinkron programozást, vagy nem érti, hogy egy aszinkron metódus hogyan használja az await
operátort a potenciálisan hosszú ideig futó munka elvégzésére anélkül, hogy blokkolta volna a hívó szálát, olvassa el az aszinkron programozás aszinkron bevezetőjét , és várja meg. A következő kód található egy aszinkron metódusban, és meghívja a metódust HttpClient.GetStringAsync :
string contents = await httpClient.GetStringAsync(requestUrl);
Az aszinkron metódus szinkron módon fut, amíg el nem éri az első await
kifejezést, ekkor a metódus fel van függesztve, amíg a várt feladat be nem fejeződik. Addig is a vezérlőelem visszatér a metódus hívójához, ahogy a következő szakaszban látható példa is mutatja.
Ha a async
kulcsszó módosító metódusa nem tartalmaz kifejezést vagy utasítást await
, a metódus szinkron módon hajtja végre. A fordító figyelmeztetése figyelmeztet minden olyan aszinkron metódusra, amely nem tartalmaz await
utasításokat, mert ez a helyzet hibát jelezhet. Lásd : Fordító figyelmeztetés (1. szint) CS4014.
A async
kulcsszó kontextusfüggő, mivel csak akkor kulcsszó, ha módosít egy metódust, egy lambdakifejezést vagy egy névtelen metódust. A rendszer minden más környezetben azonosítóként értelmezi.
Példa
Az alábbi példa egy aszinkron eseménykezelő StartButton_Click
és egy aszinkron metódus ExampleMethodAsync
közötti vezérlés struktúráját és áramlását mutatja be. Az aszinkron metódus eredménye egy weblap karaktereinek száma. A kód alkalmas a Visual Studióban létrehozott Windows megjelenítési alaprendszer (WPF) vagy Windows Áruházbeli alkalmazásokhoz; az alkalmazás beállításához tekintse meg a kód megjegyzéseit.
Ezt a kódot a Visual Studióban futtathatja Windows megjelenítési alaprendszer (WPF) alkalmazásként vagy Windows Áruházbeli alkalmazásként. El kell neveznie StartButton
egy Gomb vezérlőelemet és egy Textbox-vezérlőt.ResultsTextBox
Ne felejtse el beállítani a neveket és a kezelőt, hogy a következőhöz hasonló legyen:
<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
Click="StartButton_Click" Name="StartButton"/>
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"
Text="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
A kód FUTTATÁSA WPF-alkalmazásként:
- Illessze be ezt a kódot a
MainWindow
MainWindow.xaml.cs osztályába. - Adjon hozzá egy hivatkozást a System.Net.Http-hez.
- Adjon hozzá egy
using
irányelvet a System.Net.Http-hez.
A kód futtatása Windows Áruházbeli alkalmazásként:
- Illessze be ezt a kódot a
MainPage
MainPage.xaml.cs osztályába. - Adjon hozzá
using
irányelveket a System.Net.Http-hez és a System.Threading.Tasks-hez.
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
// ExampleMethodAsync returns a Task<int>, which means that the method
// eventually produces an int result. However, ExampleMethodAsync returns
// the Task<int> value as soon as it reaches an await.
ResultsTextBox.Text += "\n";
try
{
int length = await ExampleMethodAsync();
// Note that you could put "await ExampleMethodAsync()" in the next line where
// "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
// would not see the global side effect of ExampleMethodAsync setting the text.
ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length);
}
catch (Exception)
{
// Process the exception if one occurs.
}
}
public async Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
// After the following return statement, any method that's awaiting
// ExampleMethodAsync (in this case, StartButton_Click) can get the
// integer result.
return exampleInt;
}
// The example displays the following output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
Fontos
A tevékenységekről és a feladatra való várakozás közben végrehajtható kódról további információt az Aszinkron programozás aszinkron és várakozási lehetőségekkel című témakörben talál. A hasonló elemeket használó teljes konzolos példáért lásd: Aszinkron feladatok feldolgozása befejezett állapotban (C#).
Visszatérési típusok
Az aszinkron metódusok a következő visszatérési típusokkal rendelkezhetnek:
- Task
- Task<TResult>
- érvénytelen.
async void
a metódusok általában nem az eseménykezelőktől eltérő kódot használnak, mivel a hívók nem tudjákawait
ezeket a metódusokat, és más mechanizmust kell implementálniuk a sikeres befejezési vagy hibafeltételek jelentéséhez. - Bármely olyan típus, amely rendelkezik akadálymentes
GetAwaiter
módszerrel. ASystem.Threading.Tasks.ValueTask<TResult>
típus egy ilyen implementáció. A NuGet-csomagSystem.Threading.Tasks.Extensions
hozzáadásával érhető el.
Az aszinkron metódus nem deklarálhat be- és kimenő paramétereket, és nem rendelkezhet hivatkozási visszatérési értékkel sem, de meghívhat olyan metódusokat, amelyek ilyen paraméterekkel rendelkeznek.
Az aszinkron metódus visszatérési típusaként adja meg Task<TResult>
, ha a metódus visszatérési utasítása operandus típust TResult
ad meg. Akkor használja Task
, ha a metódus befejezésekor nem ad vissza értelmes értéket. Ez azt jelzi, hogy a metódus hívása visszaad egy Task
, de ha a Task
művelet befejeződött, minden await
olyan kifejezés, amely a Task
kiértékelésre void
vár.
A visszatérési típust void
elsősorban az eseménykezelők definiálására használja, amelyekhez a visszatérési típus szükséges. A -returning async metódus hívója void
nem tudja megvárni, és nem tudja elkapni a metódus által elvetett kivételeket.
Egy másik típust, jellemzően értéktípust GetAwaiter
ad vissza, amely a kód teljesítménykritikus szakaszaiban a memóriafoglalás minimalizálására szolgál.
További információkért és példákért tekintse meg az Async Return Types (Aszinkron visszatérési típusok) című témakört.