vyčkání (C#-Reference)
await Je použit operátor úloh v asynchronní metody pro pozastavení provádění metody až po dokončení úkolu awaited.Úkol představuje probíhající práce.
Asynchronní metody, ve kterém await používá musí změnit asynchronní klíčové slovo.Taková metoda, pomocí definovaných async modifikátor a obvykle obsahuje jeden nebo více await výrazů, je označován jako asynchronní metody.
Úlohy, které await je použit operátor vrácená hodnota z metodu, která implementuje volání je obvykle asynchronní programování založené na úkol.Příklady hodnot typu Task nebo Task<TResult>.
Následující kód HttpClient metoda GetByteArrayAsync vrátí Task<byte[]>, getContentsTask.Úkol je promise vyrábět skutečné bajtové pole po dokončení úkolu.await Je použit operátor getContentsTask pozastavení provádění v SumPageSizesAsync až getContentsTask je dokončena.Mezitím se ovládací prvek se vrátí do volajícího SumPageSizesAsync.Při getContentsTask dokončení, await výraz vyhodnocen jako bajtové pole.
private async Task SumPageSizesAsync()
{
HttpClient client = new HttpClient();
// . . .
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
// Equivalently, now that you see how it works, you can write the same thing in a single line.
//byte[] urlContents = await client.GetByteArrayAsync(url);
// . . .
}
Pro plný příklad, viz Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic). Můžete stáhnout ukázky z Developer ukázky kódu na webu společnosti Microsoft.V příkladu je v projektu AsyncWalkthrough_HttpClient.
Jako v předchozím příkladu Pokud await je použit výsledek volání metody, která vrací Task<TResult>, pak typ await je výraz TResult.Pokud await je použit výsledek volání metody, která vrací Task, pak typ await je neplatný výraz.Následující příklad ukazuje rozdíl.
// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();
// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();
await Výraz neblokuje vlákno, na kterém je vykonáván.Místo toho způsobí kompilátor zapsat zbývající asynchronní metody jako pokračování awaited úkolu.Ovládací prvek vrátí k volajícímu asynchronní metody.Po dokončení úkolu vyvolá jeho pokračování a provádění asynchronní metody životopisy, kde přestali.
await Výraz může dojít pouze v těle okamžitě ohraničujících metody, lambda výraz nebo anonymní metody, který je označen async modifikátor.Termín vyčkání slouží jako klíčové slovo pouze v této souvislosti.Jinde je interpretován jako identifikátor.Metoda, lambda výraz nebo anonymní metody await výraz nemůže dojít v těle synchronní funkce ve výrazu dotazu v catch nebo finally blokovat z příkaz pro zpracování výjimek, v bloku příkaz lock, nebo nebezpečných kontextu.
Výjimky
Většina metod asynchronní vrátit Task nebo Task<TResult>.Vlastnosti vrácené úkol provádět informace o jeho stavu a historie, zda je úkol dokončen, zda asynchronní metody způsobila výjimku nebo byla zrušena a je co konečný výsledek.await Operátor přistupuje k vlastnosti.
Pokud vyčkání asynchronní metody vrácením úkolu, který způsobuje výjimku, await operátor vyvolá výjimku.
Pokud vyčkání vrácením úkolu asynchronní metody, která je zrušena await operátor vyvolá OperationCanceledException.
Jeden úkol, který je ve stavu může odpovídat více výjimek.Úkol může být například výsledkem volání Task.WhenAll.Pokud můžete očekávat takový úkol, vyvolá await operace pouze některá z výjimek.Však nelze předpovědět, který výjimky znovu vyvolány.
Příklady zpracování chyb v asynchronní metody naleznete v tématu try-catch (C#-Reference).
Příklad
Model Windows Forms následující příklad ukazuje použití await v asynchronní metody, WaitAsynchronouslyAsync.Kontrast chování této metody s z WaitSynchronously.Bez await operátor použitý k úkolu, WaitSynchronously pracuje synchronně navzdory použití async modifikátor v jeho definici a volání Thread.Sleep v jeho textu.
private async void button1_Click(object sender, EventArgs e)
{
// Call the method that runs asynchronously.
string result = await WaitAsynchronouslyAsync();
// Call the method that runs synchronously.
//string result = await WaitSynchronously ();
// Display the result.
textBox1.Text += result;
}
// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
// Add a using directive for System.Threading.
Thread.Sleep(10000);
return "Finished";
}
Viz také
Úkoly
Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic)
Referenční dokumentace
Koncepty
Asynchronní asynchronní pro programování a očekávat (C# a Visual Basic)