C#多线程源代码

本文介绍了一个使用C# Monitor类来同步对共享队列访问的例子。通过加锁机制确保线程安全地添加和删除元素,并提供了尝试性添加、等待添加及打印所有元素的功能。

using System; using System.Collections; using System.Threading; namespace MonitorCS2 { /// <summary> /// Summary description for Class1. /// </summary> class MonitorSample { //Define the queue to safe thread access. private Queue m_inputQueue; public MonitorSample() { m_inputQueue = new Queue(); } //Add an element to the queue and obtain the monitor lock for the queue object. public void AddElement(object qValue) { //Lock the queue. Monitor.Enter(m_inputQueue); //Add element m_inputQueue.Enqueue(qValue); //Unlock the queue. Monitor.Exit(m_inputQueue); } //Try to add an element to the queue. //Add the element to the queue only if the queue object is unlocked. public bool AddElementWithoutWait(object qValue) { //Determine whether the queue is locked if(!Monitor.TryEnter(m_inputQueue)) return false; m_inputQueue.Enqueue(qValue); Monitor.Exit(m_inputQueue); return true; } //Try to add an element to the queue. //Add the element to the queue only if during the specified time the queue object will be unlocked. public bool WaitToAddElement(object qValue, int waitTime) { //Wait while the queue is locked. if(!Monitor.TryEnter(m_inputQueue,waitTime)) return false; m_inputQueue.Enqueue(qValue); Monitor.Exit(m_inputQueue); return true; } //Delete all elements that equal the given object and obtain the monitor lock for the queue object. public void DeleteElement(object qValue) { //Lock the queue. Monitor.Enter(m_inputQueue); int counter = m_inputQueue.Count; while(counter > 0) { //Check each element. object elm = m_inputQueue.Dequeue(); if(!elm.Equals(qValue)) { m_inputQueue.Enqueue(elm); } --counter; } //Unlock the queue. Monitor.Exit(m_inputQueue); } //Print all queue elements. public void PrintAllElements() { //Lock the queue. Monitor.Enter(m_inputQueue); IEnumerator elmEnum = m_inputQueue.GetEnumerator(); while(elmEnum.MoveNext()) { //Print the next element. Console.WriteLine(elmEnum.Current.ToString()); } //Unlock the queue. Monitor.Exit(m_inputQueue); } static void Main(string[] args) { MonitorSample sample = new MonitorSample(); for(int i = 0; i < 30; i++) sample.AddElement(i); sample.PrintAllElements(); sample.DeleteElement(0); sample.DeleteElement(10); sample.DeleteElement(20); sample.PrintAllElements(); } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值