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 ExampleMethodAsynchatá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 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 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="&lt;Enter a URL&gt;" 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.
  • Adja hozzá a System.Net.Http és a System.Threading.Tasks direktíváit.
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ák await 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. A System.Threading.Tasks.ValueTask<TResult> típus egy ilyen implementáció. A NuGet-csomag System.Threading.Tasks.Extensionshozzá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 TResultad 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 voidvá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 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 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.

Lásd még