Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于事件的多线程生产者-消费者?_C#_Multithreading_Events_Producer Consumer - Fatal编程技术网

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

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)); ...

我希望了解如何创建一个多线程生产者/消费者程序,其中基于外部事件进行生产

我构建了一个具有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
集合,您只需订阅它们,并在其中发生更改(发布)时接收通知

以下是您发布数据的方式:

var subject = new Subject<string>();
subject.OnNext("Value");
subject.OnCompleted();
哦,还有,所有这些都是线程安全的 使用
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“允许”的,不适用于任何库)。