c# - 消费者线程如何将结果返回给正确的生产者线程?

标签 c# multithreading concurrency

我有多个生产者线程将数据排队到线程安全的“命令优先级队列”。

还有一个“命令阅读器”消费者线程,它会不断检查这个“命令优先级队列”中的数据,将其出队,并进行必要的处理。最终在每次处理之后,需要将结果返回给发出命令的正确生产者线程。

我曾想过使用另一个线程安全的“结果队列”来对结果进行排队,但问题是如何将数据推送到相关的生产者线程?

或者是否有任何其他我可以尝试的优雅解决方案/机制或架构?

谢谢。任何帮助将不胜感激。

最佳答案

我通常做的是将“OnCompletion”事件(或任务类 OnCompletion 函数覆盖)添加到排队到线程的数据对象。当任何线程结束对数据的处理已经完成时,它调用“OnComplete”并将数据对象作为参数。原始生产者线程可以将 OnComplete 事件(或覆盖方法)设置为在从数据对象排队之前想要的任何功能。

'OnCompletion' 事件可以指示生产者线程在排队任务后等待的事件,(同步),或者它可以将任务对象排队到生产者线程的私有(private)'returnedData'阻塞队列,所以只要生产者处理它,它就可以出列和处理(异步)。

编辑:数据/任务对象应该包含异常和/或错误消息成员,这样,如果线程遇到数据问题,它可以在调用“OnCompletion”之前适本地设置它。这允许生产者线程查看是否有任何问题。

关于c# - 消费者线程如何将结果返回给正确的生产者线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027599/

相关文章:

c# - 我如何知道 .Net Compact Framework 上的线程何时结束?

Java继承与线程混淆

java - 中断长工作线程

c# - 绑定(bind)到内部 ViewModel-Property

c# - 无重叠捕获

java - java中的信号量阻塞

windows - Windows 上的 CallNamedPipe 线程安全吗

java - 亲爱的Java,为什么大部分教程看起来像是80年代的遗留物?

c# - 可以使用 && 或 ||在 switch 语句中?视觉 C#

c# - 抛出异常 : The remote certificate is invalid according to the validation procedure