首頁  >  文章  >  後端開發  >  C#中ManualResetEvent使用方法詳解

C#中ManualResetEvent使用方法詳解

黄舟
黄舟原創
2017-06-04 09:44:083264瀏覽

這篇文章主要為大家詳細介紹了ManualResetEvent使用方法,具有一定的參考價值,有興趣的小夥伴們可以參考一下

#本文實例為大家分享了ManualResetEvent的使用方法,供大家參考,具體內容如下

#1. 原始碼下載:

Demo:

#2. ManualResetEvent詳解

#    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();
    }
   }
    
  }
 }
}

以上是C#中ManualResetEvent使用方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn