当前位置: 代码迷 >> 综合 >> C# 生产者与消费者模式
  详细解决方案

C# 生产者与消费者模式

热度:84   发布时间:2024-01-25 17:13:01.0

情景:一个线程不断获取数据,另一个线程不断处理这些数据。

常规方法:数据列表加锁,两个线程获取锁,拿到操作权;类似代码如下:(不推荐)

  static void Main(string[] args){lockClass l = new lockClass();for (int i = 0; i < 1000000; i++){l.Equeue(i.ToString());}}public class lockClass{Queue<string> currentQueue = new Queue<string>(10000000);//当前要插入数据的队列 static readonly object objlock = new object();FileStream f = new FileStream("D://1.txt", FileMode.Create, FileAccess.Write, FileShare.None);StreamWriter writer;public lockClass(){writer = new StreamWriter(f);var backgroundWorker = new BackgroundWorker();backgroundWorker.DoWork += backgroundWorker_DoWork;backgroundWorker.RunWorkerAsync();}void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){while (true){lock (objlock){if (currentQueue.Count > 0){var item = currentQueue.Dequeue();Console.WriteLine(item);writer.WriteLine(item);}}}}public void Equeue(string item){lock (objlock){currentQueue.Enqueue(item);}}}        

方法3:用微软提供的BlockingCollection(线程安全的,可阻塞的资源的),个人理解就是资源安全的队列,并且当没有操作的时候(队列空闲的时候)不耗费资源,个人觉得和方法2原理类似(推荐使用)

 static void Main(string[] args){var block = new blockingCollectionClass();for (int i = 0; i < 10000; i++){block.Add(i.ToString());}Console.ReadKey(); 
}public class blockingCollectionClass{BlockingCollection<string> blockingCollection = new BlockingCollection<string>();FileStream f = new FileStream("D://1.txt", FileMode.Create, FileAccess.Write, FileShare.None);StreamWriter writer;public void Add(string Item){blockingCollection.Add(Item);}public blockingCollectionClass(){writer = new StreamWriter(f);var backgroundWorker = new BackgroundWorker();backgroundWorker.DoWork += backgroundWorker_DoWork;backgroundWorker.RunWorkerAsync();}void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){foreach (string value in blockingCollection.GetConsumingEnumerable()){Console.WriteLine(value);writer.WriteLine(value);}}}

 

  相关解决方案