Maison développement back-end Tutoriel C#.Net Comment utiliser le modèle de programmation asynchrone et la programmation simultanée pour gérer la distribution des tâches et les solutions en C#

Comment utiliser le modèle de programmation asynchrone et la programmation simultanée pour gérer la distribution des tâches et les solutions en C#

Oct 09, 2023 am 11:45 AM
并发编程 异步编程 任务分发

Comment utiliser le modèle de programmation asynchrone et la programmation simultanée pour gérer la distribution des tâches et les solutions en C#

Comment utiliser le modèle de programmation asynchrone et la programmation simultanée pour gérer la distribution des tâches et les solutions en C#

Introduction :
Dans le développement de logiciels modernes, nous sommes souvent confrontés à la situation de traiter un grand nombre de tâches, et ces tâches peuvent être indépendantes et interactif. Afin d'améliorer les performances et l'efficacité du programme, nous espérons pouvoir traiter ces tâches simultanément et obtenir les résultats correspondants lorsque chaque tâche est terminée. En tant que langage de programmation orienté objet, C# fournit des modèles de programmation asynchrone et des solutions de programmation simultanée. En utilisant ces fonctionnalités de manière appropriée, la répartition des tâches et la résolution des problèmes peuvent être gérées efficacement.

1. Modèle de programmation asynchrone
Le modèle de programmation asynchrone signifie que lors de l'exécution d'une certaine tâche, le thread principal ne sera pas bloqué, mais la tâche sera déléguée de manière asynchrone à d'autres threads ou pools de threads pour le traitement. effectuer d'autres opérations. En C#, le modèle de programmation asynchrone peut être implémenté à l'aide des mots-clés async et wait. Voici un exemple d'utilisation du modèle de programmation asynchrone :

static async Task<int> DoSomeWorkAsync()
{
    // 模拟一个耗时操作
    await Task.Delay(1000);
    return 42;
}

static async void Main(string[] args)
{
    Console.WriteLine("开始执行任务");
    int result = await DoSomeWorkAsync();
    Console.WriteLine("任务结果:" + result);
    Console.WriteLine("任务执行完毕");

    // 等待用户输入,防止控制台窗口关闭
    Console.ReadLine();
}
Copier après la connexion

Dans le code ci-dessus, la méthode DoSomeWorkAsync() est une méthode asynchrone, et le mot-clé wait indique au compilateur de ne pas bloquer le thread principal lors de l'exécution de Task.Delay( ) méthode. La méthode Main() est également marquée comme méthode asynchrone et utilise le mot clé wait pour attendre le résultat de la méthode DoSomeWorkAsync(). Grâce au modèle de programmation asynchrone, nous pouvons continuer à effectuer d'autres opérations en attendant la fin de la tâche, améliorant ainsi la vitesse de réponse du programme.

2. Programmation simultanée
Lors du traitement d'un grand nombre de tâches, la programmation simultanée peut effectivement tirer pleinement parti des avantages des processeurs multicœurs et améliorer la vitesse de traitement des tâches. En C#, vous pouvez utiliser des threads, des pools de threads, des bibliothèques parallèles de tâches, etc. pour implémenter la programmation simultanée.

  1. Threads
    L'utilisation de threads pour la programmation simultanée est la méthode la plus basique. En créant plusieurs threads et en attribuant des tâches à ces threads pour une exécution simultanée, l'efficacité du traitement peut être améliorée. Voici un exemple d'utilisation de threads :
static void DoSomeWork()
{
    Console.WriteLine("线程开始执行任务");
  
    // 模拟耗时操作
    Thread.Sleep(1000);
  
    Console.WriteLine("线程任务执行完毕");
}

static void Main(string[] args)
{
    Console.WriteLine("开始执行任务");
  
    // 创建线程
    Thread thread = new Thread(DoSomeWork);
  
    // 启动线程
    thread.Start();
  
    Console.WriteLine("任务执行中");
  
    // 等待线程执行完毕
    thread.Join();
  
    Console.WriteLine("任务执行完毕");
  
    // 等待用户输入,防止控制台窗口关闭
    Console.ReadLine();
}
Copier après la connexion

Dans le code ci-dessus, nous effectuons des tâches en créant un nouveau thread et en le démarrant. Grâce à la méthode Join() du thread, nous pouvons nous assurer que nous attendons la fin du thread avant de poursuivre l'exécution du thread principal.

  1. Thread Pool
    L'utilisation d'un pool de threads est une méthode plus efficace et gérée automatiquement. Un pool de threads crée un ensemble de threads au démarrage d'une application et réutilise ces threads pour effectuer des tâches. Voici un exemple d'utilisation du pool de threads :
static void DoSomeWork()
{
    Console.WriteLine("线程开始执行任务");
  
    // 模拟耗时操作
    Thread.Sleep(1000);

    Console.WriteLine("线程任务执行完毕");
}

static void Main(string[] args)
{
    Console.WriteLine("开始执行任务");
  
    // 使用线程池执行任务
    ThreadPool.QueueUserWorkItem(_ => DoSomeWork());
  
    Console.WriteLine("任务执行中");
  
    // 等待用户输入,防止控制台窗口关闭
    Console.ReadLine();
}
Copier après la connexion

Dans le code ci-dessus, nous déléguons la tâche au pool de threads pour l'exécution via la méthode ThreadPool.QueueUserWorkItem(). Le pool de threads allouera automatiquement un thread inactif pour effectuer des tâches, éliminant ainsi le besoin de créer et de démarrer manuellement des threads.

  1. Bibliothèque parallèle de tâches
    La bibliothèque parallèle de tâches (TPL) est un modèle de programmation simultanée avancé introduit dans .NET Framework 4. Il fournit une série de classes et de méthodes pour faciliter la gestion des tâches simultanées. Voici un exemple d'utilisation de la bibliothèque parallèle de tâches :
static void DoSomeWork()
{
    Console.WriteLine("任务开始执行");
  
    // 模拟耗时操作
    Thread.Sleep(1000);
  
    Console.WriteLine("任务执行完毕");
}

static void Main(string[] args)
{
    Console.WriteLine("开始执行任务");
  
    // 创建任务
    Task task = new Task(DoSomeWork);
  
    // 启动任务
    task.Start();
  
    Console.WriteLine("任务执行中");
  
    // 等待任务执行完毕
    task.Wait();

    Console.WriteLine("任务执行完毕");
  
    // 等待用户输入,防止控制台窗口关闭
    Console.ReadLine();
}
Copier après la connexion

Dans le code ci-dessus, nous créons une tâche (Task) pour effectuer un travail. Démarrez la tâche en appelant sa méthode Start(), puis utilisez la méthode Wait() pour attendre la fin de la tâche.

3. Distribution des tâches et solutions
Dans les applications réelles, nous pouvons avoir besoin de traiter un grand nombre de tâches et de distribuer ces tâches à plusieurs threads ou pools de threads pour une exécution simultanée. Voici un exemple de code pour montrer comment utiliser le modèle de programmation asynchrone et la programmation simultanée pour gérer la distribution des tâches et les solutions :

static async Task<int> DoSomeWorkAsync()
{
    // 模拟一个耗时操作
    await Task.Delay(1000);
    return 42;
}

static async Task Main(string[] args)
{
    Console.WriteLine("开始执行任务");

    var tasks = new List<Task<int>>();

    for (int i = 0; i < 10; i++)
    {
        tasks.Add(DoSomeWorkAsync());
    }

    // 等待所有任务完成
    await Task.WhenAll(tasks);

    Console.WriteLine("所有任务执行完毕");

    // 输出任务结果
    foreach (var task in tasks)
    {
        Console.WriteLine("任务结果:" + task.Result);
    }

    // 等待用户输入,防止控制台窗口关闭
    Console.ReadLine();
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons le modèle de programmation asynchrone pour créer plusieurs tâches et ajouter ces tâches à une tâche. liste. Attendez que toutes les tâches soient terminées en appelant la méthode Task.WhenAll(), puis parcourez la liste des tâches pour afficher les résultats de la tâche.

Conclusion :
Avec le modèle de programmation asynchrone et la programmation simultanée, nous pouvons améliorer les performances et l'efficacité du programme lors du traitement d'un grand nombre de tâches. Le modèle de programmation asynchrone nous permet de continuer à effectuer d'autres opérations en attendant que les tâches soient terminées, tandis que la programmation simultanée tire pleinement parti des processeurs multicœurs pour augmenter la vitesse d'exécution des tâches. Dans les applications pratiques, nous pouvons choisir la méthode appropriée pour répartir les tâches et résoudre des problèmes en fonction de situations spécifiques. L'exemple de code ci-dessus fournit quelques méthodes et techniques de base, mais les applications réelles peuvent nécessiter des méthodes de traitement plus détaillées et complexes, qui doivent être ajustées et optimisées en fonction de situations spécifiques.

Références :

  1. Modèle de programmation asynchrone C# : https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
  2. Programmation parallèle C# : https://docs . microsoft.com/en-us/dotnet/standard/parallel-programming/

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Conception sécurisée de structures de données en programmation simultanée C++ ? Conception sécurisée de structures de données en programmation simultanée C++ ? Jun 05, 2024 am 11:00 AM

Dans la programmation simultanée C++, la conception sécurisée des structures de données est cruciale : Section critique : utilisez un verrou mutex pour créer un bloc de code qui permet à un seul thread de s'exécuter en même temps. Verrouillage en lecture-écriture : permet à plusieurs threads de lire en même temps, mais à un seul thread d'écrire en même temps. Structures de données sans verrouillage : utilisez des opérations atomiques pour assurer la sécurité de la concurrence sans verrous. Cas pratique : File d'attente thread-safe : utilisez les sections critiques pour protéger les opérations de file d'attente et assurer la sécurité des threads.

Programmation simultanée C++ : comment effectuer la planification des tâches et la gestion du pool de threads ? Programmation simultanée C++ : comment effectuer la planification des tâches et la gestion du pool de threads ? May 06, 2024 am 10:15 AM

La planification des tâches et la gestion du pool de threads sont les clés pour améliorer l’efficacité et l’évolutivité de la programmation simultanée C++. Planification des tâches : utilisez std::thread pour créer de nouveaux threads. Utilisez la méthode join() pour rejoindre le fil de discussion. Gestion du pool de threads : créez un objet ThreadPool et spécifiez le nombre de threads. Utilisez la méthode add_task() pour ajouter des tâches. Appelez la méthode join() ou stop() pour fermer le pool de threads.

Explication détaillée des primitives de synchronisation dans la programmation simultanée C++ Explication détaillée des primitives de synchronisation dans la programmation simultanée C++ May 31, 2024 pm 10:01 PM

Dans la programmation multithread C++, le rôle des primitives de synchronisation est de garantir l'exactitude de l'accès de plusieurs threads aux ressources partagées. Elle comprend : Mutex (Mutex) : protège les ressources partagées et empêche l'accès simultané. Variable de condition (ConditionVariable) : thread Attendre une réponse spécifique ; conditions à remplir avant de poursuivre l’exécution de l’opération atomique : s’assurer que l’opération s’exécute de manière ininterrompue.

Programmation simultanée C++ : comment gérer la communication inter-thread ? Programmation simultanée C++ : comment gérer la communication inter-thread ? May 04, 2024 pm 12:45 PM

Les méthodes de communication inter-thread en C++ incluent : la mémoire partagée, les mécanismes de synchronisation (verrous mutex, variables de condition), les canaux et les files d'attente de messages. Par exemple, utilisez un verrou mutex pour protéger un compteur partagé : déclarez un verrou mutex (m) et une variable partagée (counter) ; chaque thread met à jour le compteur en verrouillant (lock_guard) ; pour éviter les conditions de course.

Programmation simultanée C++ : comment éviter la famine des threads et l'inversion des priorités ? Programmation simultanée C++ : comment éviter la famine des threads et l'inversion des priorités ? May 06, 2024 pm 05:27 PM

Pour éviter la pénurie de threads, vous pouvez utiliser des verrous équitables pour garantir une allocation équitable des ressources ou définir des priorités de thread. Pour résoudre l'inversion de priorité, vous pouvez utiliser l'héritage de priorité, qui augmente temporairement la priorité du thread contenant la ressource ; ou utiliser la promotion de verrouillage, qui augmente la priorité du thread qui nécessite la ressource.

Problèmes courants et solutions dans la programmation asynchrone dans le framework Java Problèmes courants et solutions dans la programmation asynchrone dans le framework Java Jun 04, 2024 pm 05:09 PM

3 problèmes et solutions courants dans la programmation asynchrone dans les frameworks Java : Callback Hell : utilisez Promise ou CompletableFuture pour gérer les rappels dans un style plus intuitif. Conflit de ressources : utilisez des primitives de synchronisation (telles que des verrous) pour protéger les ressources partagées et envisagez d'utiliser des collections thread-safe (telles que ConcurrentHashMap). Exceptions non gérées : gérez explicitement les exceptions dans les tâches et utilisez un cadre de gestion des exceptions (tel que CompletableFuture.exceptionally()) pour gérer les exceptions.

Programmation simultanée C++ : comment terminer et annuler un thread ? Programmation simultanée C++ : comment terminer et annuler un thread ? May 06, 2024 pm 02:12 PM

Les mécanismes de terminaison et d'annulation de thread en C++ incluent : Terminaison de thread : std::thread::join() bloque le thread actuel jusqu'à ce que le thread cible termine son exécution ; std::thread::detach() détache le thread cible de la gestion des threads. Annulation de thread : std::thread::request_termination() demande au thread cible de terminer l'exécution ; std::thread::get_id() obtient l'ID du thread cible et peut être utilisé avec std::terminate() pour terminer immédiatement la cible. fil de discussion. En combat réel, request_termination() permet au thread de décider du moment de la fin, et join() garantit que sur la ligne principale

Comment le framework Golang gère-t-il la concurrence et la programmation asynchrone ? Comment le framework Golang gère-t-il la concurrence et la programmation asynchrone ? Jun 02, 2024 pm 07:49 PM

Le framework Go utilise les fonctionnalités de concurrence et asynchrones de Go pour fournir un mécanisme permettant de gérer efficacement les tâches simultanées et asynchrones : 1. La concurrence est obtenue via Goroutine, permettant d'exécuter plusieurs tâches en même temps. 2. La programmation asynchrone est implémentée via des canaux, qui peut être exécuté sans bloquer le thread principal;3. Convient aux scénarios pratiques, tels que le traitement simultané des requêtes HTTP, l'acquisition asynchrone des données de base de données, etc.

See all articles