Megosztás:


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, 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="&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.
  • Adjon hozzá using irá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át async void , mert a hívók nem await tudjá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 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 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.

Lásd még