Sdílet prostřednictvím


asynchronní (C#-Reference)

async Modifikátor označuje, že metoda, lambda výraz, nebo anonymní metody , upravuje je asynchronní.Tyto metody jsou označovány jako asynchronní metody.

Asynchronní metody poskytuje pohodlný způsob pro potenciálně dlouhotrvající práci bez blokování volajícího vlákna.Volající asynchronní metody můžete pokračovat v jeho práci bez čekání na dokončení asynchronní metodu.

Následující příklad ukazuje strukturu asynchronní metody.Podle úmluvy končí asynchronní metody názvy "Asynchronní."

public async Task<int> ExampleMethodAsync()
{
    // . . .

    // At the await expression, execution in this method is suspended and,
    // if AwaitedProcessAsync has not already finished, control returns
    // to the caller of ExampleMethodAsync.
    int exampleInt = await AwaitedProcessAsync();

    // . . .

    // The return statement completes the task. Any method that is 
    // awaiting ExampleMethodAsync can now get the integer result.
    return exampleInt;
}

Obvykle metoda upravena async klíčové slovo obsahuje nejméně jeden vyčkání výrazu nebo příkazu.Metoda pracuje synchronně, dokud nedosáhne první await výraz v tomto okamžiku je pozastavena, dokud nebude awaited úkolu.Do té doby řízení vrácen volající metodu.Pokud neobsahuje metodu await výrazu nebo příkazu, pak provedena synchronně.Upozornění kompilátoru upozorní všechny asynchronní metody, které neobsahují await protože tato situace může znamenat chybu.Další informace naleznete v tématu Upozornění kompilátoru (úroveň 1) CS4014.

async Kontextové klíčové slovo je klíčové slovo.Upravuje způsob, lambda výraz nebo anonymní metody je klíčové slovo.V jiných kontextech je interpretován jako identifikátor.

Návratové typy

Asynchronní metody mohou mít návratový typ Task, Task<TResult>, nebo void.Metodu nelze deklarovat všechny ref nebo podle parametry, přestože je volání metody, které mají tyto parametry.

Zadání Task<TResult> jako návratový typ asynchronní metody Pokud vrátit prohlášení metoda určuje operand typu TResult.Pomocí Task Pokud je vrácena žádná smysluplná hodnota po dokončení metody.Vrátí volání metody Task, ale když Task dokončení jakékoli await výraz, který čeká Task vyhodnocen jako void.

void Vrátit typ slouží především k definování obslužné rutiny událostí, kde void požadovaný typ vrácené.Volající asynchronní metody vracející void nelze očekávat a nelze zachytit výjimky, které vyvolá metoda.

Další informace a příklady naleznete v tématu Typy vrácení asynchronní (C# a Visual Basic).

Příklad

Následující příklady ukazují asynchronní obslužnou rutinu, lambda asynchronní a asynchronní metody.Kompletní příklad, který používá tyto prvky viz Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic).Stáhnout návod kódu z Developer ukázky kódu.

// An event handler must return void.
private async void button1_Click(object sender, RoutedEventArgs e)
{
    textBox1.Clear();
    // SumPageSizesAsync is a method that returns a Task.
    await SumPageSizesAsync();
    textBox1.Text += "\r\nControl returned to button1_Click.\r\n";
}


// The following async lambda expression creates an equivalent anonymous
// event handler.
button1.Click += async (sender, e) => {
    textBox1.Clear();
    // SumPageSizesAsync is a method that returns a Task.
    await SumPageSizesAsync();
    textBox1.Text += "\r\nControl returned to button1_Click.\r\n";
}


// The following async method returns a Task<T>.
// A typical call awaits the byte array result: 
//      byte[] result = await GetURLContentsAsync("https://msdn.com");
private async Task<byte[]> GetURLContentsAsync(string url)
{
    // The download will end up in variable content.
    var content = new MemoryStream();

    // Initialize an HttpWebRequest for the current URL.
    var webReq = (HttpWebRequest)WebRequest.Create(url);

    // Send the request to the Internet resource and wait for
    // the response.
    using (WebResponse response = await webReq.GetResponseAsync())
    {
        // Get the data stream that is associated with the specified url.
        using (Stream responseStream = response.GetResponseStream())
        {
            await responseStream.CopyToAsync(content);
        }
    }

    // Return the result as a byte array.
    return content.ToArray();
}

Viz také

Úkoly

Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic)

Referenční dokumentace

vyčkání (C#-Reference)

AsyncStateMachineAttribute

Koncepty

Asynchronní asynchronní pro programování a očekávat (C# a Visual Basic)