Explication détaillée et exemples de synchronisation à l'aide d'AutoResetEvent en C#

黄舟
Libérer: 2017-03-28 11:10:42
original
1635 Les gens l'ont consulté

Cet article présente principalement en détail les informations pertinentes de C# utilisant AutoResetEvent pour réaliser la synchronisation. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer aux articles précédents

Aujourd'hui, j'ai rencontré un. problème avec l'exécution séquentielle d'un thread, qui est un thread asynchrone envoyant une requête de données à l'interface A. Un autre thread asynchrone envoie une demande de données à l'interface B. Lorsque A et B sont exécutés avec succès, il envoie une demande à l'interface C. Pour être honnête, j'ai travaillé sur des projets BS et je ne connais pas grand-chose aux threads. Je savais qu'AutoResetEvent était lié aux threads et était utilisé pour gérer le changement de thread, j'ai donc décidé d'utiliser AutoResetEvent pour résoudre les problèmes ci-dessus.

J'ai donc recherché des informations pertinentes en ligne :

Il s'avère qu'AutoResetEvent est souvent utilisé dans la programmation multithread .Net. Lorsqu'un thread appelle la méthode WaitOne, le signal est à l'état d'envoi, le thread recevra le signal et le programme continuera à s'exécuter, sinon il attendra. De plus, AutoResetEvent.WaitOne() n'autorise qu'un seul thread à entrer à la fois. Lorsqu'un thread reçoit le signal, AutoResetEvent définit automatiquement le signal sur un état de non-envoi. Les autres threads appelant WaitOne ne peuvent que continuer à attendre. , AutoResetEvent ne peut fonctionner que lorsqu'un thread est réveillé, les autres threads sont toujours bloqués.

Introduction

AutoResetEvent(bool initialState) : Constructeur , avec une indication s'il faut définir l'état initial pour qu'il se termine Valeur booléenne qui initialise une nouvelle instance de cette classe.
false : Aucun signal, la méthode WaitOne du thread enfant ne sera pas automatiquement appelée
true : Il y a un signal, la méthode WaitOne du thread enfant sera automatiquement appelée
Reset () : Définissez le le statut de l'événement à un état non terminé, provoquant le blocage du thread ; si l'opération réussit, il renvoie vrai, sinon il renvoie faux ;
Set () : définit le statut de l'événement sur le statut terminé, permettant à un ou plusieurs threads en attente de continuer si l'opération réussit, renvoie true sinon, renvoie false ;
WaitOne() : bloque le thread actuel jusqu'à ce qu'un signal soit reçu.
WaitOne(TimeSpan, Boolean) : bloque le thread actuel jusqu'à ce que l'instance actuelle reçoive le signal, utilise TimeSpan pour mesurer l'intervalle de temps et spécifie s'il faut quitter le domaine de synchronisation avant d'attendre.
WaitAll() : Attendez tous les signaux.

Implémenter

 class Program
 {

  static void Main()
  {
   Request req = new Request();

   //这个人去干三件大事 
   Thread GetCarThread = new Thread(new ThreadStart(req.InterfaceA));
   GetCarThread.Start();

   Thread GetHouseThead = new Thread(new ThreadStart(req.InterfaceB));
   GetHouseThead.Start();

   //等待三件事都干成的喜讯通知信息 
   AutoResetEvent.WaitAll(req.autoEvents);

   //这个人就开心了。 
   req.InterfaceC();

   System.Console.ReadKey();
  }
 }

 public class Request
 {
  //建立事件数组 
  public AutoResetEvent[] autoEvents = null;

  public Request()
  {
   autoEvents = new AutoResetEvent[]
   {
    new AutoResetEvent(false),
    new AutoResetEvent(false)
   };
  }

  public void InterfaceA()
  {
   System.Console.WriteLine("请求A接口");

   Thread.Sleep(1000*2);

   autoEvents[0].Set();

   System.Console.WriteLine("A接口完成");
  }

  public void InterfaceB()
  {
   System.Console.WriteLine("请求B接口");

   Thread.Sleep(1000 * 1);

   autoEvents[1].Set();

   System.Console.WriteLine("B接口完成");
  }

  public void InterfaceC()
  {
   System.Console.WriteLine("两个接口都已经请求完,正在处理C");
  }
 }
Copier après la connexion

Notez qu'il est préférable d'ajouter un délai d'attente à WaitOne ou WaitAll. Sinon, aucun signal n'est reçu et le thread sera toujours bloqué.

Postface

Ceci est juste une simplification de la scène ci-dessus, principalement utilisée pour résoudre le problème de la scène que je viens de mentionner.
Ce qui précède est un résumé de mon utilisation d'AutoResetEvent. S'il vous plaît, donnez-moi quelques indications sur les lacunes.

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!

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