Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon d'utiliser ManualResetEvent en C#

Explication détaillée de la façon d'utiliser ManualResetEvent en C#

黄舟
黄舟original
2017-05-28 09:59:591832parcourir

Cet article présente principalement l'utilisation de ManualResetEvent en détail, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

L'exemple dans. cet article explique comment utiliser ManualResetEvent pour votre référence. Le contenu spécifique est le suivant

1. Téléchargement du code source :

Adresse de téléchargement : ManualResetEvent

Démo :

2. Explication détaillée de ManualResetEvent

ManualResetEvent permet aux threads de communiquer entre eux en envoyant des signaux. En règle générale, cette communication implique des tâches qu'un thread doit accomplir avant que les autres threads puissent continuer. Lorsqu'un thread démarre une activité (cette activité doit se terminer avant que d'autres threads puissent démarrer), il appelle Reset pour mettre le ManualResetEvent dans un état

sans fin , et ce thread peut être considéré comme contrôlant le ManualResetEvent. Le thread appelant WaitOne sur ManualResetEvent bloquera et attendra le signal. Lorsque le thread de contrôle termine son activité, il appelle Set pour signaler que le thread en attente peut continuer. et libérez tous les threads en attente. Une fois terminé, un ManualResetEvent restera terminé (c'est-à-dire que le thread appelant WaitOne reviendra immédiatement et ne bloquera pas) jusqu'à ce qu'il soit réinitialisé manuellement. L'état initial d'un ManualResetEvent peut être contrôlé en passant une valeur booléenne au constructeur, qui est vrai si l'état initial est terminé, faux sinon ;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ManualResetEventDemo
{
 class MREDemo
 {
  private ManualResetEvent _mre;
 
  public MREDemo()
  {
   this._mre = new ManualResetEvent(true);
  }
 
  public void CreateThreads()
  {
   Thread t1 = new Thread(new ThreadStart(Run));
   t1.Start();
 
   Thread t2 = new Thread(new ThreadStart(Run));
   t2.Start();
  }
 
  public void Set()
  {
   this._mre.Set();
  }
 
  public void Reset()
  {
   this._mre.Reset();
  }
 
  private void Run()
  {
   string strThreadID = string.Empty;
   try
   {
    while (true)
    {
     // 阻塞当前线程
     this._mre.WaitOne();
 
     strThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
     Console.WriteLine("Thread(" + strThreadID + ") is running...");
 
     Thread.Sleep(5000);
    }
   }
   catch(Exception ex)
   {
    Console.WriteLine("线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString());
   }
  }
 
 }
}

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