C# 基于事件的多线程生产者-消费者?
我希望了解如何创建一个多线程生产者/消费者程序,其中基于外部事件进行生产 我构建了一个具有2个线程循环的同步队列,一个用于排队,另一个用于排队并写入文件,采用经典模式:C# 基于事件的多线程生产者-消费者?,c#,multithreading,events,producer-consumer,C#,Multithreading,Events,Producer Consumer,我希望了解如何创建一个多线程生产者/消费者程序,其中基于外部事件进行生产 我构建了一个具有2个线程循环的同步队列,一个用于排队,另一个用于排队并写入文件,采用经典模式: Class SyncQueue { ... producerThread = new Thread(new ThreadStart(StartProducer)); consumerThread = new Thread(new ThreadStart(StartConsumer)); ...
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
集合,您只需订阅它们,并在其中发生更改(发布)时接收通知
以下是您发布数据的方式:
var subject = new Subject<string>();
subject.OnNext("Value");
subject.OnCompleted();
哦,还有,所有这些都是线程安全的请考虑使用RX。它们是现代的、灵活的、方便的、支持多线程的、简单的、很酷的。呵呵
使用IObservable
集合,您只需订阅它们,并在其中发生更改(发布)时接收通知
以下是您发布数据的方式:
var subject = new Subject<string>();
subject.OnNext("Value");
subject.OnCompleted();
哦,还有,所有这些都是线程安全的 放弃自定义的同步队列,使用 使用
BlockingCollection
,您没有单独的线程控制队列。相反,您有一个队列,线程可以直接将项目排队或出列。数据结构本身处理任何并发问题,并在尝试出列时执行非忙等待
有关示例,请参见和,或者只是四处搜索一下。另外,请参阅my以了解更多详细信息。放弃自定义的同步队列并使用 使用
BlockingCollection
,您没有单独的线程控制队列。相反,您有一个队列,线程可以直接将项目排队或出列。数据结构本身处理任何并发问题,并在尝试出列时执行非忙等待
有关示例,请参见和,或者只是四处搜索一下。另外,请参阅my以了解更多详细信息。感谢您提供这些提示,我更喜欢.Net标准解决方案。如果没有其他的方法,我会考虑使用它。嗯,RX-不仅仅是一些第三方库。尽管它没有包含在.NET标准的“包”中,但如果说“标准化”(由Microsoft Open Technologies,Inc.开发),它仍然与ASP.NET MVC相同。您可以理解,只要注意到组件“活动”在
System.Reactive
名称空间中(这是Microsoft“允许”的,不适用于任何库)。感谢您提供这些提示,我希望使用.Net标准解决方案。如果没有其他的方法,我会考虑使用它。嗯,RX-不仅仅是一些第三方库。尽管它没有包含在.NET标准的“包”中,但如果说“标准化”(由Microsoft Open Technologies,Inc.开发),它仍然与ASP.NET MVC相同。您可以理解,只要注意到组件“活动”在System.Reactive
命名空间中(这是Microsoft“允许”的,不适用于任何库)。