Udostępnij za pośrednictwem


poczekać (C# odniesienia)

await z zadaniem w asynchronicznej metody do zawieszenia wykonanie metody dopiero po zakończeniu zadania oczekiwany stosowany jest operator.Zadanie reprezentuje pracy w toku.

Metod asynchronicznych, w którym await jest używana muszą zostać zmienione przez asynchroniczne słowa kluczowego.Taka metoda, definiowane za pomocą async modyfikator i zazwyczaj zawierające jeden lub więcej await wyrażenia, jest określany jako metody asynchronicznej.

[!UWAGA]

async i await słowa kluczowe zostały wprowadzone w Visual Studio 2012.Aby uzyskać informacje na temat nowych funkcji w tej wersji, zobacz Co nowego w Visual Studio 2012.

Wprowadzenie do programowania asynchronicznych, zobacz Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic).

Zadania, które await stosowany jest operator zazwyczaj jest wartość zwracaną przez wywołanie do metody, która implementuje wzór asynchronicznych opartych na zadaniach.Przykłady obejmują wartości typu Task lub Task<TResult>.

W poniższym kodzie HttpClient metoda GetByteArrayAsync zwraca Task<byte[]>, getContentsTask.Zadanie jest promise umożliwia utworzenie tablicy bajtowej rzeczywiste podczas zadanie zostało wykonane.await Operator jest stosowana do getContentsTask do Wstrzymaj wykonywanie kodu w SumPageSizesAsync do getContentsTask została zakończona.W międzyczasie, sterowanie jest zwracane do rozmówcy SumPageSizesAsync.Gdy getContentsTask została zakończona, await wyrażenie zostanie oszacowane jako tablicy bajtów.

private async Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    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);
    // . . .
}
Ważna uwagaWażne

Na przykład pełną, zobacz Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic).Można pobrać próbki z Przykładów kodu autora w witrynie firmy Microsoft.W przykładzie jest w programie project AsyncWalkthrough_HttpClient.

Jak pokazano w poprzednim przykładzie, jeśli await jest stosowany do wyników wywołania metody, która zwraca Task<TResult>, następnie typ await wyrażenie jest TResult.Jeśli await jest stosowany do wyników wywołania metody, która zwraca Task, następnie typ await wyrażenie jest nieważne.Poniższy przykład ilustruje różnicę.

// 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 Wyrażenia nie są blokowane w wątku, na którym jest wykonywany.Zamiast tego powoduje kompilator zasubskrybowanie pozostałe metody asynchronicznej jako kontynuacja oczekiwany zadania.Następnie sterowanie jest zwracane do obiektu wywołującego metodę komunikacji asynchronicznej.Po zakończeniu zadania, wywołuje jego kontynuacji i realizacji życiorysy metoda komunikacji asynchronicznej, którym zostało przerwane.

await Wyrażenie może mieć tylko organ natychmiast otaczającej metoda, wyrażenie lambda lub metody anonimowej, które cechuje async modyfikator.Termin czekają na służy jako słowo kluczowe, tylko w tym kontekście.W innym miejscu jest interpretowany jako identyfikator.W ramach metod, wyrażenie lambda lub metody anonimowej await wyrażenie nie może wystąpić w treści funkcji synchronicznej, w wyrażeniu kwerendy w catch lub finally blok z Instrukcja obsługi wyjątków, w bloku instrukcji "lock", lub w niebezpieczne kontekstu.

Wyjątki

Większości metod komunikacji asynchronicznej powrócić Task lub Task<TResult>.Właściwości zadania zwracane przewożenia informacji na temat stanu i historii, takie jak czy zadanie zostało wykonane, czy metody asynchronicznej spowodował wyjątek lub została anulowana i co się.await Operator uzyskuje dostęp do tych właściwości.

Jeśli czekają na powrót zadanie metoda komunikacji asynchronicznej, która powoduje wyjątek, await operator rethrows wyjątku.

Jeśli czekają na zwracanie zadanie metody asynchronicznej, który został anulowany, await operator rethrows OperationCanceledException.

Poszczególne zadania, który jest stan może odzwierciedlać wiele wyjątków.Na przykład zadanie może być skutkiem połączenia Task.WhenAll.Operacja oczekiwać poczekać na takie zadanie rethrows tylko jeden z wyjątków.Jednak nie można przewidzieć, który z tych wyjątków jest rethrown.

Przykłady obsługi błędów w transmisji asynchronicznej metod, zobacz try-catch (C# odniesienia).

Przykład

W poniższym przykładzie Windows Forms ilustruje użycie await w metodzie komunikacji asynchronicznej, WaitAsynchronouslyAsync.Zachowanie tej metody, z zachowaniem kontrastu WaitSynchronously.Bez await operator stosowany do zadania, WaitSynchronously jest uruchamiana synchronicznie, mimo stosowania async modyfikator w jego definicji i wezwanie do Thread.Sleep w jego treści.

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";
}

Zobacz też

Zadania

Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic)

Informacje

Asynchroniczne (C# odniesienia)

Koncepcje

Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic)