Préface
Le blogueur a simplement compté les articles asynchrones qu'il a publiés, et il y en a déjà 8 par intermittence. Cette fois, je veux prendre le type de retour asynchrone comme un. exemple. Parlez seul.
Les méthodes asynchrones ont trois types de retour possibles : Task
Quand utiliser quel type de retour ? La situation spécifique nécessite une analyse spécifique. S'il est mal utilisé, le résultat de l'exécution du programme peut ne pas être celui que vous souhaitez. Parlons de la façon de choisir différents types de retour pour différentes situations.
Tâche
[Rappelez-vous] Lorsque vous ajoutez le mot-clé async, vous devez renvoyer un objet qui sera utilisé pour les opérations ultérieures, veuillez utiliser Task
Le type de retour Task
Dans l'exemple suivant, la méthode asynchrone GetDateTimeAsync contient une instruction return qui renvoie l'heure actuelle. Par conséquent, la déclaration de méthode doit spécifier Task
async Task<DateTime> GetDateTimeAsync() { //Task.FromResult 是一个占位符,类型为 DateTime return await Task.FromResult(DateTime.Now); }
Appelez la méthode GetDateTimeAsync :
async Task CallAsync() { //在另一个异步方法的调用方式 DateTime now = await GetDateTimeAsync(); }
Lorsque GetDateTimeAsync est appelé depuis une expression d'attente, l'expression d'attente récupère la valeur de type DateTime stockée dans la tâche renvoyée par GetDateTimeAsync.
async Task CallAsync() { //在另一个异步方法的调用方式 //DateTime now = await GetDateTimeAsync(); //换种方式调用 Task<DateTime> t = GetDateTimeAsync(); DateTime now = await t; }
La méthode GetDateTimeAsync est appelée via la méthode CallAsync, et l'appel à la méthode d'attente non immédiate GetDateTimeAsync renvoie Task
Cette fois, je démontre différentes variables, vous pouvez comparer les résultats vous-même :
async Task CallAsync() { //在另一个异步方法的调用方式 DateTime now = await GetDateTimeAsync(); //换种方式调用 Task<DateTime> t = GetDateTimeAsync(); DateTime now2 = await t; //输出的结果对比 Console.WriteLine($"now: {now}"); Console.WriteLine($"now2: {now2}"); Console.WriteLine($"t.Result: {t.Result}"); }
[Note] L'attribut Résultat est un attribut verrouillé. Si vous essayez d'y accéder avant que sa tâche ne soit terminée, le thread actuellement actif sera bloqué jusqu'à ce que la tâche soit terminée et que la valeur soit disponible. Dans la plupart des cas, vous devez accéder à la valeur de la propriété en utilisant wait plutôt qu'en accédant directement à la propriété.
Tâche
Les méthodes asynchrones qui ne contiennent pas d'instruction return ou contiennent une instruction return qui ne renvoie pas d'opérande ont généralement le type de retour Task. Si elles sont écrites pour s’exécuter de manière asynchrone, ces méthodes seront des méthodes de retour vide. Si vous utilisez le type de retour Task dans une méthode asynchrone, la méthode appelante peut utiliser l'opérateur wait pour suspendre l'achèvement de l'appelant jusqu'à ce que la méthode asynchrone appelée se termine.
Voir exemple :
async Task DelayAsync() { //Task.Delay 是一个占位符,用于假设方法正处于工作状态。 await Task.Delay(100); Console.WriteLine("OK!"); }
Appelez et attendez la méthode DelayAsync en utilisant une instruction wait au lieu d'une expression wait, similaire à l'instruction call pour une méthode qui renvoie void. L'application de l'opérateur wait ne produit pas de valeur dans ce cas.
Voir un exemple d'appel de DelayAsync.
//调用和等待方法在同一声明中 await DelayAsync();
Maintenant, je sépare la méthode d'appel et d'attente :
//分离 Task delayTask = DelayAsync(); await delayTask; void
le type de retour void est principalement utilisé dans les gestionnaires d'événements, où le type de retour void est requis. Le type de retour void peut également être utilisé comme alternative aux méthodes qui renvoient void, ou pour les méthodes qui exécutent des activités pouvant être classées comme activités d'appel et d'oubli. Cependant, vous devez renvoyer Task autant que possible car vous ne pouvez pas attendre les méthodes asynchrones qui renvoient void. Tout appelant d'une telle méthode ne peut procéder qu'à l'achèvement sans attendre la fin de la méthode asynchrone appelée, et l'appelant doit être indépendant de toute valeur ou exception générée par la méthode asynchrone.
Les appelants d'une méthode asynchrone qui renvoie void ne peuvent pas intercepter les exceptions émises par la méthode, et de telles exceptions non gérées peuvent provoquer des échecs d'application. Si une exception se produit dans une méthode asynchrone qui renvoie une tâche ou une tâche
Maintenant, les exceptions peuvent également utiliser wait, veuillez vous rendre ici "Retour sur le passé et le présent de C# - Soyez témoin des nouvelles fonctionnalités de syntaxe de C# 6.0".
Exemple de valeur de retour vide :
private async void button1_Click(object sender, EventArgs e) { //启动进程并等待完成 await Task.Delay(100); }
Ce qui précède est l'examen de base en C# des types de retour Async. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php. cn) !