Examen des bases de C# Type de retour asynchrone

黄舟
Libérer: 2017-02-07 15:08:48
original
1888 Les gens l'ont consulté

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, Task et void.

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 peut être utilisé pour certaines méthodes asynchrones où l'opérande est de type TResult.

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);
}
Copier après la connexion

Appelez la méthode GetDateTimeAsync :

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    DateTime now = await GetDateTimeAsync();
}
Copier après la connexion

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;
}
Copier après la connexion

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. La tâche est affectée à la variable Task du DateTime dans l'exemple. Étant donné que la variable Task de DateTime est Task, elle appartient à la propriété DateTime contenant le type TResult. Dans ce cas, TResult représente le type de date. Lorsque l'attente est appliquée à une tâche, l'expression d'attente est évaluée selon le contenu de la propriété DateTime de la tâche. Dans le même temps, la valeur est affectée à la variable now.

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}");
}
Copier après la connexion

[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!");
}
Copier après la connexion

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();
Copier après la connexion

Maintenant, je sépare la méthode d'appel et d'attente :

//分离
Task delayTask = DelayAsync();
await delayTask;        
void
Copier après la connexion

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, l'exception sera stockée dans la tâche renvoyée et déclenchée à nouveau en attendant cette tâche. Par conséquent, assurez-vous que toutes les méthodes asynchrones pouvant déclencher des exceptions ont un type de retour Task ou Task et que les appels à ces méthodes sont attendus.

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);
}
Copier après la connexion

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) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!