Maison  >  Article  >  développement back-end  >  Obtenez une compréhension plus approfondie des tâches en C#

Obtenez une compréhension plus approfondie des tâches en C#

PHPz
PHPzoriginal
2024-02-18 12:03:24565parcourir

Obtenez une compréhension plus approfondie des tâches en C#

Explication détaillée de la tâche C#, des exemples de code spécifiques sont requis

Introduction :
Dans la programmation multithread C#, la tâche est un modèle de programmation couramment utilisé pour implémenter des opérations asynchrones. Task fournit un moyen simple de gérer des tâches simultanées, peut effectuer des opérations asynchrones en parallèle sur plusieurs threads et peut gérer facilement les exceptions et les valeurs de retour. Cet article présentera en détail l’utilisation de C# Task et fournira quelques exemples de code spécifiques.

1. Création et fonctionnement de Task

  1. Méthodes pour créer des objets Task
    Il existe de nombreuses façons de créer des objets Task en C#, les trois suivantes sont couramment utilisées :
    a Utiliser un constructeur pour créer :

    Task task = new Task(() => {
     // 异步任务逻辑
    });

    b. Utilisez la méthode Task.Run pour créer : Task.Run方法创建:

    Task task = Task.Run(() => {
     // 异步任务逻辑
    });

    c. 使用TaskFactory.StartNew方法创建:

    TaskFactory taskFactory = new TaskFactory();
    Task task = taskFactory.StartNew(() => {
     // 异步任务逻辑
    });
  2. Task的启动和等待
    任务创建完成后,可以通过调用Task.Start方法来启动任务的执行。然后可以使用Task.Wait方法来等待任务完成。示例如下:

    task.Start(); // 启动任务
    task.Wait(); // 等待任务完成

    需要注意的是,如果使用Task.RunTaskFactory.StartNew创建的任务,会自动启动,不需要调用Start方法。

  3. Task的取消
    在某些情况下,需要取消一个正在执行的任务。可以使用CancellationToken来实现任务的取消。示例如下:

    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    CancellationToken cancellationToken = cancellationTokenSource.Token;
    
    Task task = Task.Run(() => {
     while (true) {
         // 检查任务是否被取消
         if (cancellationToken.IsCancellationRequested) {
             break;
         }
    
         // 异步任务逻辑
     }
    }, cancellationToken);
    
    // 取消任务
    cancellationTokenSource.Cancel();

    在任务的逻辑中,通过定期检查CancellationToken.IsCancellationRequested属性来判断任务是否需要取消。

二、Task的异常处理和返回值

  1. 异常处理
    在异步任务中,如果发生异常,默认情况下任务会直接抛出异常导致程序崩溃。为了处理任务中的异常,可以在任务中使用try...catch语句来捕获异常,并处理异常的逻辑。示例如下:

    Task task = Task.Run(() => {
     try {
         // 异步任务逻辑
     }
     catch (Exception ex) {
         // 异常处理逻辑
     }
    });
  2. 返回值
    有时候需要从异步任务中获取返回值。使用Task<tresult></tresult>类可以实现任务的返回值传递。TResult是返回值的类型。示例如下:

    Task<int> task = Task.Run(() => {
     // 异步任务逻辑
     return 42;
    });
    
    int result = task.Result;

    在上述示例中,Task<int></int>表示该任务返回一个整数。通过Task.Result属性可以获取到返回值。

三、Task的并行执行
Task可以方便地实现任务的并行执行,提高程序的性能。C#提供了Parallel类来简化并行编程。示例如下:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 并行执行计算
Parallel.ForEach(numbers, number => {
    Console.WriteLine(number * number);
});

上述示例中,使用Parallel.ForEachrrreee

c. Utilise la méthode TaskFactory.StartNew pour créer :

rrreee

Démarrage et attente de la tâche🎜Après la création de la tâche. est terminé, vous pouvez démarrer l'exécution de la tâche en appelant la méthode Task.Start. Vous pouvez ensuite utiliser la méthode Task.Wait pour attendre la fin de la tâche. Un exemple est le suivant : 🎜rrreee🎜Il est à noter que si une tâche est créée à l'aide de Task.Run ou TaskFactory.StartNew, elle sera démarrée automatiquement et il y a pas besoin d'appeler la méthode Start. 🎜🎜🎜Annulation de tâche🎜Dans certains cas, il est nécessaire d'annuler une tâche en cours d'exécution. Vous pouvez utiliser <code>CancellationToken pour annuler la tâche. Un exemple est le suivant : 🎜rrreee🎜Dans la logique de la tâche, déterminez si la tâche doit être annulée en vérifiant régulièrement la propriété CancellationToken.IsCancellationRequested. 🎜🎜2. Gestion des exceptions de tâche et valeurs de retour 🎜🎜🎜🎜Gestion des exceptions🎜Dans une tâche asynchrone, si une exception se produit, par défaut, la tâche lèvera directement une exception et provoquera le programme s'écraser. Afin de gérer les exceptions dans les tâches, vous pouvez utiliser l'instruction try...catch dans la tâche pour intercepter les exceptions et gérer la logique des exceptions. Un exemple est le suivant : 🎜rrreee🎜🎜Valeur de retour🎜Parfois, vous devez obtenir la valeur de retour d'une tâche asynchrone. Utilisez la classe Task<tresult></tresult> pour réaliser le transfert de la valeur de retour de la tâche. TResult est le type de valeur de retour. Un exemple est le suivant : 🎜rrreee🎜Dans l'exemple ci-dessus, Task<int></int> signifie que la tâche renvoie un entier. La valeur de retour peut être obtenue via la propriété Task.Result. 🎜🎜3. Exécution parallèle des tâches🎜Task peut facilement mettre en œuvre l'exécution parallèle des tâches et améliorer les performances du programme. C# fournit la classe Parallel pour simplifier la programmation parallèle. Un exemple est le suivant : 🎜rrreee🎜Dans l'exemple ci-dessus, la méthode Parallel.ForEach est utilisée pour effectuer des calculs de carrés sur une liste de nombres en parallèle. On peut voir que des tâches informatiques avec des nombres différents peuvent être exécutées en parallèle sur différents threads. 🎜🎜Résumé : 🎜Cet article présente l'utilisation de C# Task en détail et fournit quelques exemples de code spécifiques. En utilisant Task, vous pouvez facilement implémenter des opérations asynchrones et améliorer les performances de concurrence du programme. Dans le même temps, Task fournit également des mécanismes simples de gestion des exceptions et de transmission des valeurs de retour, rendant la programmation simultanée plus flexible et plus facile à maintenir. J'espère que les lecteurs auront une compréhension plus approfondie de C# Task grâce à l'introduction et aux exemples de cet article, et pourront l'appliquer de manière flexible dans des projets réels. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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