Maison  >  Article  >  développement back-end  >  Examen des bases de C# Type de retour asynchrone

Examen des bases de C# Type de retour asynchrone

黄舟
黄舟original
2017-02-07 15:08:481889parcourir

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 : Taskb54c2c292509147c0b54128f4eb90887, 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âcheb54c2c292509147c0b54128f4eb90887

[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 Taskb54c2c292509147c0b54128f4eb90887.

Le type de retour Taskb54c2c292509147c0b54128f4eb90887 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 Task9db9db54d21ae9db056aa10d2db0be56.

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 Task9db9db54d21ae9db056aa10d2db0be56. La tâche est affectée à la variable Task du DateTime dans l'exemple. Étant donné que la variable Task de DateTime est Task9db9db54d21ae9db056aa10d2db0be56, 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âche9db9db54d21ae9db056aa10d2db0be56, l'expression d'attente est évaluée selon le contenu de la propriété DateTime de la tâche9db9db54d21ae9db056aa10d2db0be56. 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}");
}

[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âcheb54c2c292509147c0b54128f4eb90887, 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 Taskb54c2c292509147c0b54128f4eb90887 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);
}

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


Déclaration:
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