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-06-04 09:44:083202parcourir

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 partage l'utilisation de ManualResetEvent pour votre référence. Le contenu spécifique est le suivant

1. Téléchargement du code source :

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 à l'état 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());
   }
  }
 
 }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ManualResetEventDemo
{
 class Program
 {
  static void Main(string[] args)
  {
   Console.WriteLine("****************************");
   Console.WriteLine("输入\"stop\"停止线程运行...");
   Console.WriteLine("输入\"run\"开启线程运行...");
   Console.WriteLine("****************************\r\n");
 
   MREDemo objMRE = new MREDemo();
   objMRE.CreateThreads();
 
   while (true)
   {
    string input = Console.ReadLine();
    if (input.Trim().ToLower() == "stop")
    {
     Console.WriteLine("线程已停止运行...");
     objMRE.Reset();
    }
    else if (input.Trim().ToLower() == "run")
    {
     Console.WriteLine("线程开启运行...");
     objMRE.Set();
    }
   }
    
  }
 }
}

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