繁体   English   中英

基于事件的多线程生产者-消费者?

[英]Event-based multithread producer-consumer?

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

我建立了一个具有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?
}

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

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

如果有人可以告诉我该怎么做,我将不胜感激。 我是C#的新手,对事件处理没有很深的了解。

只需考虑使用Rx (反应式扩展)即可 它们是现代的,灵活的,方便的,支持多线程,并且很酷。 呵呵

使用IObservable<T>集合,只需订阅它们并在它们发生更改(发布)时接收通知。

这是您发布数据的方式:

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 */ });

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

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

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

有关示例,请参见https://stackoverflow.com/a/19848796/56778https://stackoverflow.com/a/19823345/56778 ,或者只是进行一些搜索。 另外,请参阅我的简单多线程博客文章 ,了解更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM