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_Concurrent Queue - Fatal编程技术网

C# 使用并发队列在我的应用程序的两个组件之间传递对象

C# 使用并发队列在我的应用程序的两个组件之间传递对象,c#,multithreading,concurrent-queue,C#,Multithreading,Concurrent Queue,我有一个程序,它利用c#并发队列将数据从一个组件传递到另一个组件 构成部分1: 多个网络连接接收数据,然后将其放入此队列 构成部分2: 从该队列读取数据,然后对其进行处理 好吧,一切都有意义(我当然希望如此) 现在我想知道的是,在两个组件之间传递数据的最佳/最有效的方法是什么 备选案文1: 在组件2中轮询队列以获取新数据?这将需要阻塞代码,或者至少一个while(true) 备选案文2: 我不知道这是否可能,但这就是为什么我在这里问。队列数据结构是否没有一种功能,即我的组件2可以注册到队列中,以

我有一个程序,它利用c#并发队列将数据从一个组件传递到另一个组件

构成部分1: 多个网络连接接收数据,然后将其放入此队列

构成部分2: 从该队列读取数据,然后对其进行处理

好吧,一切都有意义(我当然希望如此)

现在我想知道的是,在两个组件之间传递数据的最佳/最有效的方法是什么

备选案文1: 在组件2中轮询队列以获取新数据?这将需要阻塞代码,或者至少一个
while(true)

备选案文2:
我不知道这是否可能,但这就是为什么我在这里问。队列数据结构是否没有一种功能,即我的组件2可以注册到队列中,以收到任何插入/更改的通知?这样,每当添加数据时,它都可以直接获取数据,然后我就可以避免任何阻塞/轮询代码。

对于生产者/消费者的简单实现,您可以尝试使用。对于更复杂的数据消费,来自不同来源的数据可能会有所帮助。这是一个更加陡峭的学习曲线,但它是一个非常强大的基于拉动的框架,因此您不需要进行任何轮询。

对于生产者/消费者的简单实现,您可以尝试使用。对于更复杂的数据消费,来自不同来源的数据可能会有所帮助。这是一个更陡峭的学习曲线,但它是一个非常强大的基于拉动的框架,因此您不需要进行任何轮询。

组件1(生产者)需要手动或自动阻止,因为您在制作时预期多个访问(多个帖子)。这意味着BlockingQueue在Component1中有意义。然而,在组件2中(使用者),如果您认为您(在任何时候)只有一个使用者,那么您不需要任何阻塞代码

为了节省或避免while,您必须需要一种机制来通知消费者有人在队列中添加了内容。这可以通过使用自定义事件(不讨论EventHandle子类型)来实现。请记住,在这种事件样式中可能没有元素顺序

组件1(生产商)需要手动或自动阻塞,因为您在生产过程中预计会有多个访问(多个帖子)。这意味着BlockingQueue在Component1中有意义。然而,在组件2中(使用者),如果您认为您(在任何时候)只有一个使用者,那么您不需要任何阻塞代码


为了节省或避免while,您必须需要一种机制来通知消费者有人在队列中添加了内容。这可以通过使用自定义事件(不讨论EventHandle子类型)来实现。请记住,在这种事件样式中可能没有元素顺序

什么是组件(可能是)?上课?你如何使用这个课程?传递数据的最简单方法是使用事件并将数据包装到
EvengArgs
中。但也可以使用无参数事件(当您从
sender
或实例检索数据时,可以通过某种方式进行访问).events不能用于此目的吗?@Sinatr component只是我选择的一个理论名称,用于在更高级别上表示应用程序。在生产者/消费者方案中,阻塞方法是传统的,使用BlockingCollection(包装器)。这样,无论何时添加数据,它都可以直接获取数据-它如何知道如何获取数据?要在使用者线程上触发事件,使用者需要一个事件调度循环,即,它必须在阻塞队列中等待消息……什么是组件(可能是)?上课?你如何使用这个课程?传递数据的最简单方法是使用事件并将数据包装到
EvengArgs
中。但也可以使用无参数事件(当您从
sender
或实例检索数据时,可以通过某种方式进行访问).events不能用于此目的吗?@Sinatr component只是我选择的一个理论名称,用于在更高级别上表示应用程序。在生产者/消费者方案中,阻塞方法是传统的,使用BlockingCollection(包装器)。这样,无论何时添加数据,它都可以直接获取数据-它如何知道如何获取数据?要在使用者线程上触发事件,使用者需要一个事件调度循环,即,它必须在阻塞队列中等待消息…..好的,基本上你说的是,除非我想得到非常复杂的阻塞是一个足够的解决方案?好的,基本上你说的是,除非我想得到非常复杂的阻塞是一个足够的解决方案吗?是的,你是正确的,多个生产者单一consumer@Zapnologica,要完成此操作,您可以使用选项2,其中封装了consumer 1实现中的自定义事件,在将项添加到队列中时将触发事件。然后在组件2中订阅此事件。希望这对你有所帮助。是的,你是对的,多个制作人consumer@Zapnologica,要完成此操作,您可以使用选项2,其中封装了consumer 1实现中的自定义事件,在将项添加到队列中时将触发事件。然后在组件2中订阅此事件。希望这有帮助。