C# 线程之间传递数据(生产者,消费者)BlockingCollection

这是线程安全的,常用于线程之间数据传输
生产者生产一条数据,消费者提取一条数据进行处理

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Immutable;
using System.Collections.Concurrent;
using System.Threading;
  class Program
    {
        static void Main(string[] args)
        {
            BlockingCollection<string> bc = new BlockingCollection<string>(10);
            Task.Factory.StartNew(() =>
            {
                new Productor().Product(bc);
 
            });
            Task.Factory.StartNew(() =>
            {
                new Customer().Consume(bc);
 
            });
            Console.ReadKey();
        }
    }
    class Productor
    {   
        public void Product(BlockingCollection<string> bc)
        {
            for (int i = 1; i <= 50; i++)
            {
                Thread.Sleep(500);
                bc.Add("第" + i + "个物品");
                Console.WriteLine("生产了第" + i + "个物品");           
            }
        }
    }
    class Customer
    {     
        public void Consume(BlockingCollection<string> bc)
        {
            Random random = new Random();
            foreach (var item in bc.GetConsumingEnumerable())
            {
                Console.WriteLine("消费了" + item);
                Thread.Sleep(random.Next(500, 2000));
            }
        }
    }

demo2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Immutable;
using System.Collections.Concurrent;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        public static BlockingCollection<Teacher> vs = new BlockingCollection<Teacher>();
        static void Main(string[] args)
        {
            generate();
            ss();
            Console.ReadKey();
        }


        public static void generate()
        {
            Task task = new Task(() =>
              {
                  for (int i = 0; i < 100; i++)
                  {
                      Thread.Sleep(1000);
                      int age = i;
                      vs.Add(new Teacher()
                      {
                          age = age,
                          name = Convert.ToString(age)
                      });
                  }
              });
            task.Start();
        }


        public static void ss()
        {

            foreach (var item in vs.GetConsumingEnumerable())
            {
                Console.WriteLine(item.name);
            }
            
            
        }
    }

    class Teacher
    {
        public int age { get; set; }


        public string name { get; set; }
    }
}


版权声明:本文为weixin_43632687原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。