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

标签 c# multithreading events 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#的新手,对事件处理没有很深的了解。

最佳答案

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

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

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

关于c# - 基于事件的多线程生产者-消费者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19930320/

相关文章:

c# - for循环直接跳到最后

c# - 无法弄清楚如何让 Blueprint.NET 与 OrientDB 一起工作。其他人让它工作吗?

c# - 多线程调用委托(delegate)

javascript - 如何知道 .keyup() 是否是字符键(jQuery)

c# - 无论我设置的间隔等待时间如何,Selenium WebDriver 都会在 60 秒时超时

c# - 需要描述性架构来开发 dot net 中的文件服务器

c++ - 带有 SCHED_OTHER 的可移植 pthread_setschedparam

c++ - 正确使用和实现单例

php - 我如何将其绑定(bind)到 JQUERY 中的 onclick 事件?

javascript - 按左/右箭头执行某些操作