【问题标题】:Event-based multithread producer-consumer?基于事件的多线程生产者-消费者?
【发布时间】:2013-11-12 13:20:08
【问题描述】:

我想弄清楚如何创建一个基于外部事件的多线程生产者/消费者程序。

我已经建立了一个同步队列,它有 2 个线程循环,一个用于入队,一个用于出列并写入文件,具有经典模式:

Class SyncQueue  
{
    ...
    producerThread = new Thread(new ThreadStart(StartProducer));
    consumerThread = new Thread(new ThreadStart(StartConsumer));
    ...

    public void Start()
    {
        producerThread.Start();
        consumerThread.Start();
    }

    public void StartProducer()
    {
        while (!stop)
        { 
            //wait for an external event to happen 
            //Data data = eventHandler() : How to wait for an event and get?
            Enqueue(data);
        }
    }
}

另一方面,我在另一个类中有一个独立处理外部事件的方法。

public void OnExternalEvent()
{
    //event occured 
    //how to notify and send data to the producer thread?
}

我的问题不是关于生产者/消费者模式,而是关于在其中整合事件。

我发布的代码只是为了让我的问题更清楚,我在cmets中添加了两个具体问题。

如果有人能告诉我该怎么做,我将不胜感激。我是 C# 新手,没有很强的事件处理背景。

【问题讨论】:

    标签: c# multithreading events producer-consumer


    【解决方案1】:

    放弃您的自定义同步队列并使用BlockingCollection< T >

    使用BlockingCollection,您没有单独的线程来控制队列。相反,您有一个队列,线程可以直接将项目入队或出队。数据结构本身处理任何并发问题,并在尝试出队时进行非忙等待。

    有关示例,请参见 https://stackoverflow.com/a/19848796/56778https://stackoverflow.com/a/19823345/56778,或者只是搜索一下。另外,请参阅我的Simple Multithreading blog post 了解更多详细信息。

    【讨论】:

      【解决方案2】:

      只需考虑使用 Rx (Reactive extensions) 即可。它们现代、灵活、方便、支持多线程,而且很简单。呵呵

      使用IObservable&lt;T&gt; 集合,您只需订阅它们并在有更改(发布)到它们时收到通知。

      这是您发布数据的方式:

      var subject = new Subject<string>();
      subject.OnNext("Value");
      subject.OnCompleted();
      

      订阅方式如下:

      subject.SubscribeOn(Scheduler.CurrentThread);  // this is for thread safety, for instance
      subject.Subscribe(() => { /* some action */ });
      

      哦,还有,所有这些都是线程安全的!

      【讨论】:

      • 感谢您提供这些提示,我更喜欢 .Net 标准解决方案。如果没有其他办法,我会考虑使用它。
      • 嗯,Rx——不仅仅是一些第三方库。尽管它没有包含在 .NET 标准“包”中,但如果说“标准化”(并且由 Microsoft Open Technologies, Inc. 开发),它仍然与 ASP.NET MVC 相同。您可以理解,只要注意到 System.Reactive 命名空间中的组件“活动”(微软“允许”而不是任何库)。
      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多