【问题标题】:How do I pass the data from one thread to three other threads?如何将数据从一个线程传递到其他三个线程?
【发布时间】:2014-09-24 03:52:49
【问题描述】:

我必须编写一个包含四个线程的应用程序:

  1. 线程生成一些数据(生产者线程);
  2. 线程从生产者线程获取数据并执行Action1(data);
  3. 线程从生产者线程获取数据并执行Action2(data);
  4. 线程从生产者线程获取数据并执行Action3(data);

如何将相同的数据传递给所有三个消费线程?我仅限于 .NET 3.0 库,即不能使用 ConcurrentQueues 等。

【问题讨论】:

  • 从线程继承四次。使用属性或设置器甚至在 ctor 中扩展派生,您可以在 t1 完成时传递数据。然后,将返回的数据从 t1 传递给衍生品后,开始它们的工作。
  • I can't use such things as ConcurrentQueues and so on. 然后使用标准字典/队列/列表,但 锁定所有读写
  • @L.B 没那么简单。 BlockingCollection给你的操作是“等你有别的东西给我,再给我”的操作,让这个操作相当不错。重新实现它需要的不仅仅是 lock

标签: c# .net multithreading producer-consumer data-sharing


【解决方案1】:

一种选择是让您的生产者在产生数据时触发一个事件,允许您拥有任意数量的不同消费者订阅该事件并根据线程池线程中的数据将要完成的工作排入队列。

public class Producer
{
    public event Action<Data> DataProduced;

    public void Produce()
    {
        while (true)
        {
            Thread.Sleep(1000);//placeholder for real work
            DataProduced(new Data());//populate with real data
        }
    }
}

Producer producer = new Producer();

producer.DataProduced += data => 
    ThreadPool.QueueUserWorkItem(_ => Consume1(data));
producer.DataProduced += data => 
    ThreadPool.QueueUserWorkItem(_ => Consume2(data));
producer.DataProduced += data => 
    ThreadPool.QueueUserWorkItem(_ => Consume3(data));

producer.Produce();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2015-02-23
    • 2010-10-17
    • 2013-01-26
    相关资源
    最近更新 更多