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.
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, aszinkron metódust kell létrehoznia. Az alábbi példa egy aszinkron metódust ExampleMethodAsynchatároz meg:
public async Task<int> ExampleMethodAsync()
{
//...
}
A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
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ó műveletek elvégzésére anélkül, hogy blokkolja a hívó szálát, olvassa el az aszinkron programozás aszinkron bevezetőjét, és várja. 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 lesz függesztve, amíg a várt tevékenység 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ó környezetfüggő. Ez csak akkor kulcsszó, ha módosít egy metódust, egy lambda kifejezést vagy egy névtelen metódust. Minden más környezetben a fordító azonosítóként értelmezi.
Az alábbi példa egy aszinkron eseménykezelő StartButton_Clickés egy aszinkron metódus ExampleMethodAsynckö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 Presentation Foundation (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
MainWindowMainWindow.xaml.cs osztályába. - Adjon hozzá egy hivatkozást a System.Net.Http-hez.
- Adjon hozzá egy
usingirányelvet a System.Net.Http-hez.
A kód futtatása Windows Áruházbeli alkalmazásként:
- Illessze be ezt a kódot a
MainPageMainPage.xaml.cs osztályába. - Adjon hozzá
usingirá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>
-
void. Általában kerülje az eseménykezelőken kívüli kódkezelési módszerek használatátasync void, mert a hívók nemawaittudják ezeket a metódusokat használni, é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
GetAwaitermódszerrel. ASystem.Threading.Tasks.ValueTask<TResult>típus egy ilyen implementáció. A NuGet-csomagSystem.Threading.Tasks.Extensionshozzáadásával érhető el.
Az aszinkron metódus nem deklarálhat semmilyen in, ref, vagy ref readonlyout paramétert, és nem rendelkezhet hivatkozási visszatérési értékkel sem. Az ilyen paraméterekkel rendelkező metódusokat azonban meghívhatja.
Adja meg Task<TResult> az aszinkron metódus visszatérési típusaként, ha a metódus visszatérési utasítása a típus TResultoperandusát adja meg. Akkor használja Task , ha a metódus nem ad vissza értelmes értéket a befejezéskor. 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 voidvár. A visszatérési void típust elsősorban az eseménykezelők definiálására használhatja, amelyekhez a visszatérési típus szükséges. A -returning async metódus hívója voidnem 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 memóriafoglalások minimalizálására szolgál a kód teljesítménykritikus szakaszaiban.
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.