源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C# ManualResetEvent使用方法详解

  • 时间:2021-08-29 18:01 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C# ManualResetEvent使用方法详解
本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下 [b]1. 源码下载:[/b] 下载地址:[url=http://xiazai.jb51.net/201705/yuanma/ManualResetEvent(jb51.net).rar]ManualResetEvent[/url] Demo: [img]http://files.jb51.net/file_images/article/201705/2017526153356710.jpg?2017426153411[/img] [b]2. ManualResetEvent详解[/b]     ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
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();
    }
   }
    
  }
 }
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部