日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# ManualResetEvent的理解和用法

發(fā)布時(shí)間:2023/12/15 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# ManualResetEvent的理解和用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ManualResetEvent是C#中一個(gè)比較常用的工具,可用于線程間通信,實(shí)現(xiàn)一種類似信號(hào)量的功能(不知道我這樣描述是否恰當(dāng),有可能不是“類似”,而“就是”通過(guò)信號(hào)量來(lái)實(shí)現(xiàn)的,因?yàn)槲乙彩亲罱胖肋@個(gè)類,以前一直不知道,哈哈。如果有哪位清楚的話,請(qǐng)給我解惑。)。

先了解一下ManualResetEvent的基本用法:

1、初始化:public ManualResetEvent(bool initialState);

  ManualResetEvent的構(gòu)造方法有個(gè)bool型參數(shù),當(dāng)為true時(shí),則表示有信號(hào),為false時(shí),則表示無(wú)信號(hào)。這個(gè)怎么理解呢?我們接著看ManualResetEvent3個(gè)基本方法中的WaitOne方法。

2、WaitOne方法:WaitOne方法有幾種4種重載,我在這里只對(duì)它的功能進(jìn)行分析。

  WaitOne方法,顧名思義,它會(huì)具有一種等待的功能,也就是線程阻塞。這里的阻塞功能是有條件的,當(dāng)無(wú)信號(hào)時(shí),它是阻塞的,有信號(hào)時(shí),它將無(wú)任何阻塞,被執(zhí)行時(shí)就直接跳過(guò)了(這個(gè)從邏輯上應(yīng)該挺好理解:當(dāng)有信號(hào)需要處理時(shí),需要立即處理,沒(méi)有任何信號(hào)時(shí),就當(dāng)然要等一等了)。所以,回顧到1,當(dāng)初始化ManualResetEvent時(shí),initialState為false,WaitOne將會(huì)有阻塞效果,否則,沒(méi)有阻塞效果。

3、Set方法:將ManualResetEvent對(duì)象的信號(hào)狀態(tài)設(shè)為有信號(hào)狀態(tài),這個(gè)時(shí)候WaitOne如果正在阻塞中的話,將會(huì)立即終止阻塞,向下繼續(xù)執(zhí)行。而且這個(gè)狀態(tài)一直不變的話,每次執(zhí)行到WaitOne都將無(wú)任何阻塞。

4、Reset方法:將ManualResetEvent對(duì)象的信號(hào)狀態(tài)設(shè)為無(wú)信號(hào)狀態(tài),當(dāng)下次執(zhí)行到WaitOne時(shí),又將重新開(kāi)始阻塞。

呵呵,按我個(gè)人理解,ManualResetEvent得幾個(gè)方法的功能大致就這個(gè)意思。嗯,口說(shuō)無(wú)憑,代碼才是王道。接下來(lái)我用一個(gè)生產(chǎn)消費(fèi)模型的例子來(lái)給大家班門弄斧一下!

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading;namespace ThreadTest {class Program{static void Main(string[] args){new ProductAndCostTester();}}/// <summary>/// 生產(chǎn)消費(fèi)模型/// </summary>public class ProductAndCostTester{/// <summary>/// 生產(chǎn)線1線程/// </summary>private Thread _producterThread1;/// <summary>/// 生產(chǎn)線2線程/// </summary>private Thread _producterThread2;/// <summary>/// 消費(fèi)線線程/// </summary>private Thread _costerThread;/// <summary>/// 產(chǎn)品列表/// </summary>private List<int> _goodList;/// <summary>/// ManualResetEvent實(shí)例/// </summary>private ManualResetEvent _mre;public ProductAndCostTester(){_goodList = new List<int>();_mre = new ManualResetEvent(false);//false初始化狀態(tài)為無(wú)信號(hào),將使WaitOne阻塞 _producterThread1 = new Thread(Product1);_producterThread1.Name = "Productor1";_producterThread1.Start();_producterThread2 = new Thread(Product2);_producterThread2.Name = "Productor2";_producterThread2.Start();_costerThread = new Thread(Cost);_costerThread.Name = "Costor";_costerThread.Start();}/// <summary>/// 生產(chǎn)線1/// </summary>void Product1(){while (true){Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));for (int i = 0; i < 3; i++){_goodList.Add(1);}_mre.Set();//表示有信號(hào)了,通知WaitOne不再阻塞 Thread.Sleep(8000);}}/// <summary>/// 生產(chǎn)線2/// </summary>void Product2(){while (true){Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));for (int i = 0; i < 6; i++){_goodList.Add(1);}_mre.Set();//表示有信號(hào)了,通知WaitOne不再阻塞 Thread.Sleep(10000);}}/// <summary>/// 消費(fèi)線/// </summary>void Cost(){while (true){if (_goodList.Count > 0){Console.WriteLine("Cost " + _goodList.Count + " at " + DateTime.Now.ToString("HH:mm:ss"));_goodList.Clear();_mre.Reset();//重置為無(wú)信號(hào)了,使WaitOne可以再次阻塞 }else{Console.WriteLine("No cost at " + DateTime.Now.ToString("HH:mm:ss"));_mre.WaitOne();//如果沒(méi)有可消費(fèi)的產(chǎn)品,即無(wú)信號(hào),則會(huì)阻塞 }}}} }

這個(gè)代碼是可以直接運(yùn)行的,我就不再用附件了。嗯,下面我來(lái)簡(jiǎn)單講解一下我這個(gè)代碼想表達(dá)什么:

這里有3個(gè)線程,2條生產(chǎn)線和1條消費(fèi)線。2條生產(chǎn)線同時(shí)進(jìn)行,但是可能生產(chǎn)的速度不一致(這里一個(gè)8s/次,一個(gè)10s/次)。而另外一個(gè)消費(fèi)線程也是與生產(chǎn)線同時(shí)運(yùn)行的,我想實(shí)現(xiàn)一個(gè)目標(biāo):每當(dāng)有產(chǎn)品可以消費(fèi)時(shí),我將立即消費(fèi),不想有任何延遲。

按照以前最簡(jiǎn)單常用的思路,就是讓消費(fèi)線程每次運(yùn)行sleep一下,但是這個(gè)需要循環(huán)時(shí)間足夠短、循環(huán)頻率足夠快才行,頻率至少要高于任意一個(gè)生產(chǎn)線程,即sleep時(shí)間小于生產(chǎn)線程中sleep時(shí)間的最小值。

如果這樣實(shí)現(xiàn),代碼從邏輯來(lái)講是沒(méi)有任何問(wèn)題的,但是效率太低了,而且可能遭遇麻煩。假設(shè)這樣一種情況,如果生產(chǎn)線程的生產(chǎn)頻率是不固定的(不像我們這固定sleep幾秒鐘,這個(gè)在真實(shí)情況中是存在的),有時(shí)候1小時(shí)才生產(chǎn)一次,有時(shí)候100毫秒生產(chǎn)一次(笑,這個(gè)比較極端啊),那么我們至少需要將消費(fèi)線程的sleep時(shí)間低于100毫秒才行。這樣的話當(dāng)生產(chǎn)線程1個(gè)小時(shí)一次的時(shí)候是不是也太浪費(fèi)了,基本上消費(fèi)線程在空轉(zhuǎn)。

所以嘛,才有了我這樣一個(gè)代碼,我的消費(fèi)線程每次循環(huán)都會(huì)檢查已經(jīng)生產(chǎn)出來(lái)的產(chǎn)品數(shù)量,當(dāng)有產(chǎn)品可供消費(fèi)的時(shí)候,我就一次消費(fèi)光,并且提醒:“已經(jīng)沒(méi)有可消費(fèi)的產(chǎn)品了,下次可能需要等等了!”(調(diào)用Reset方法),那么下次循環(huán)時(shí),檢查到果然沒(méi)有產(chǎn)品了,那么就將等待了(WaitOne方法阻塞)。這時(shí)候消費(fèi)線程就會(huì)完全停在這了,不會(huì)每次都空轉(zhuǎn),是不是比較人性化?呵呵。

接下來(lái),任意一個(gè)生產(chǎn)線程如果生產(chǎn)出新的產(chǎn)品,就將會(huì)通知消費(fèi)線程:“嘿,伙計(jì),你要的東西來(lái)了,快醒醒吧!”(調(diào)用Set方法),這樣消費(fèi)線程就會(huì)立馬繼續(xù)運(yùn)行(WaitOne方法將會(huì)繼續(xù)向下執(zhí)行,并且在再次Reset前,它都不會(huì)再阻塞了)。當(dāng)然,消費(fèi)線程得下次循環(huán)將檢測(cè)到有產(chǎn)品可供消費(fèi)了,它又會(huì)將產(chǎn)品消費(fèi)完,并且又提醒:“已經(jīng)沒(méi)有可消費(fèi)的產(chǎn)品了,下次可能需要等等了!”(調(diào)用Reset方法)。就這樣生命不息,循環(huán)往復(fù)。

轉(zhuǎn)載于:https://www.cnblogs.com/modify/archive/2013/01/10/2855014.html

總結(jié)

以上是生活随笔為你收集整理的C# ManualResetEvent的理解和用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美高潮视频 | youjizz国产| 久久这里只有精品6 | 理伦毛片 | 五月天婷婷综合 | 一二三不卡视频 | 日韩av女优在线观看 | 成人影片网址 | 亚洲欧美另类视频 | 国产福利视频一区二区 | 欧美日韩综合在线观看 | 欧美日韩无| 亚洲色图欧美自拍 | 精品成人一区二区三区 | 男人的天堂色 | 国产精品伊人 | 啪啪自拍视频 | 国产欧美亚洲一区二区 | 国产视频不卡一区 | 澳门久久| 成人三级视频 | 疯狂伦交 | 一区二区中文字幕 | 日韩三级视频在线播放 | 日韩免费视频一区二区视频在线观看 | 欧美区视频 | 中文字幕一区二区三区夫目前犯 | 华人av在线 | 久久久高清 | 久久久久久久女国产乱让韩 | 久草福利在线视频 | 中文字幕久久熟女蜜桃 | 晨勃顶到尿h1v1 | 国产精品国产三级国产专播品爱网 | 成人精品免费看 | 色呦呦免费视频 | 国产精品日韩一区二区 | 69久久精品无码一区二区 | 日韩精品一区二区三区免费视频 | jizz性欧美2 视频在线日韩 | 亚洲男人天堂电影 | 一级片视频在线观看 | 国精产品一区一区三区有限公司杨 | 少妇愉情理伦片bd | 日本女优一区 | 特级免费毛片 | 午夜不卡久久精品无码免费 | 僵尸叔叔在线观看国语高清免费观看 | 亚洲色图15p | 亚洲av成人片无码 | 日韩视频免费在线 | 人人草人人爱 | 精品视频免费观看 | 日韩簧片在线观看 | 国产免费黄色片 | 国产一区2 | 杏导航aⅴ福利网站 | 高清av网站 | 一个人在线观看免费视频www | 激情综合一区二区三区 | 热久久免费 | 草草影院第一页yycc.com | 国产免费av网站 | 国产一区二区黄 | 99久久精品国产一区色 | 欧美性受xxxx黑人猛交88 | 处女朱莉第一次 | 日韩一级影院 | 日本亲近相奷中文字幕 | 草草草在线视频 | 国产嫩草在线观看 | 日本久久一区 | 自拍亚洲欧美 | 在线看国产视频 | 一本大道av伊人久久综合 | 伊人成综合网 | 国产成人激情视频 | 国产精品99久久久久久久久 | 少妇做爰免费理伦电影 | 久久久久久无码精品大片 | 久久91精品国产91久久小草 | 香港三级日本三级韩国三级 | 相亲对象是问题学生在线观看 | 人人九九精 | 国产欧美一区二区三区视频在线观看 | 久久久久久欧美 | 中国美女洗澡免费看网站 | 伦av综合一区| 三度诱惑免费版电影在线观看 | 精品人妻无码一区二区三 | 天天做日日做 | 国产精品区一 | 东北少妇bbbb搡bbb搡 | 亚洲免费色图 | 91国产精品一区 | 国产免费三片 | 国产亚洲精品久久久久丝瓜 | 日韩国产毛片 | 国产一区视频在线免费观看 |