这是线程安全的,常用于线程之间数据传输
生产者生产一条数据,消费者提取一条数据进行处理
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版权协议,转载请附上原文出处链接和本声明。