2

我有一种情况,我有一个 TCPClient 的轮询线程(这是离散 TCP 设备的最佳计划吗?)它聚合消息并偶尔通过触发事件来响应这些消息。如果线程被长时间阻塞,事件生产者真的不太在意,但是消费者的设计是这样的,我宁愿让它在我拥有的用于处理状态的单个工作线程上调用处理程序机器。

那么问题就是这个。我应该如何使用任务库最好地管理这些线程的创建、配置(线程名称、背景等)生命周期以及调用的编组?我对使用 Thread 类型显式执行此操作有些熟悉,但是如果可能的话,我的公司更愿意通过使用 Task 来做我们可以做的事情。

编辑:我相信我在这里需要的将基于消费者类型的 SynchronizationContext ,以确保任务是与该上下文相关的单个线程上的计划。

4

2 回答 2

2

那么问题就是这个。我应该如何使用任务库最好地管理这些线程的创建、配置(线程名称、背景等)生命周期以及调用的编组?

这听起来像是BlockingCollection<T>. 此类专为生产者/消费者场景而设计,允许您将任何线程添加到集合中(其作用类似于线程安全队列),以及一个(或多个)线程或任务调用blockingCollection.GetConsumingEnumerable()来“使用”这些项目。

于 2012-08-13T16:07:47.987 回答
0

您可以考虑使用TPL DataFlow,您可以在其中设置ActionBlock<T>从 TCP 线程推送消息的位置,然后 TPL DataFlow 将通过扩展硬件可以处理的操作处理来处理其余部分。您还可以通过配置 来精确控制操作的处理ActionBlock<T>MaxDegreeOfParallelism

由于处理有时无法跟上传入数据的流动,您可能需要考虑BufferBlock<T>在前面“链接”a,ActionBlock<T>以确保 TCP 处理线程不会超前于您实际处理的内容。这与使用BlockingCollection<T>有限容量具有相同的效果。

最后,请注意,我链接到 .NET 4.5 文档是因为它最简单,但 TPL DataFlow 可通过单独的下载.NET 4.0 获得。不幸的是,他们从未用它制作过 NuGet 包。

于 2012-08-13T18:25:23.230 回答