ManualResetEvent知識總結

1、 用法概述函數

Manual發音:英[ˈmænjuəl]ui

直譯,手動重置事件spa

開發者的能夠手動對線程間的交互進行手動控制.線程

2、構造函數xml

構造函數,若是爲 true,則將初始狀態設置爲終止;若是爲 false,則將初始狀態設置爲非終止。blog

public ManualResetEvent(
	bool initialState //是否爲 終止狀態
)

若是 ManualResetEvent 的初始狀態是終止狀態(即,若是其經過爲 initialState 傳遞true 建立),則等待 ManualResetEvent 的線程不阻塞。(亦即WaitOne方法不能阻塞當前線程的執行)事件

若是初始狀態爲非終止狀態(false),則線程調用 Set() 方法後纔不阻塞。ci

故:一般狀況下,咱們初始化爲false(非終止狀態)開發

3、須要理解和掌握的幾個方法get

1.WaiOne

阻止當前線程,直到收到信號(固然初始化狀態須要爲false)

WaitOne有幾個重載方法,經過時間進行WaitOne,若是超時就不阻塞了.

其餘幾個版本:MSDN地址

 

2.Set

將事件狀態設置爲終止狀態,容許一個或多個等待線程繼續。

3.ReSet

將事件狀態設置爲非終止狀態,致使線程阻止。

 

4、Demo(網友提供)

using System;
using System.Threading;
namespace ThreadingTester
{
	class ThreadClass
	{
		public static ManualResetEvent mre=new ManualResetEvent(false);
		public static void trmain()
		{
			Thread tr = Thread.CurrentThread;
			Console.WriteLine("thread: waiting for an event");
			mre.WaitOne(11);
			Console.WriteLine("thread: got an event");
			for(int x=0;x < 10;x++)
			{
				Thread.Sleep(1000);
				Console.WriteLine(tr.Name +": " + x);
			}
		}
		static void Main(string[] args)

		{
			Thread thrd1=new Thread(new ThreadStart(trmain));
			thrd1.Name="thread1";
			thrd1.Start();
			for(int x=0;x < 10;x++)
			{
				Thread.Sleep(900);
				Console.WriteLine("Main:" + x);
				if(5==x) mre.Set();
			}
			while(thrd1.IsAlive)
			{
				Thread.Sleep(1000);
				Console.WriteLine("Main: waiting for thread to stop");
			}
			
			Console.Read();
		}
	}
}

  

5、使用場景

一般出現用於 不一樣功能的代碼且位於不一樣的線程之中時, 須要進行數據協同.

相關文章
相關標籤/搜索