我有一种情况,我有TCPClient的轮询线程(这是离散TCP设备的最佳计划吗?),它聚合消息并偶尔通过触发事件来响应这些消息。如果线程长时间被阻塞,事件生产者真的不在乎,但是消费者的设计是这样的,我更喜欢让它在我处理状态的单个工作线程上调用处理程序机。
那么问题是这个。我应该如何最好地管理创建,配置(线程名称,后台等)生命周期,以及使用任务库对这些线程的调用进行编组?我有点熟悉使用Thread类型明确地做这个,但是当我的公司尽可能地通过使用Task来做我们可以做的事情。
编辑:我相信我需要的是基于消费者类型的SynchronizationContext,确保任务是与该上下文相关联的单个线程上的调度。
答案 0 :(得分:2)
那么问题是这个。我应该如何最好地管理创建,配置(线程名称,后台等)生命周期,以及使用任务库对这些线程的调用进行编组?
这听起来像BlockingCollection<T>
的完美用例。此类专为生产者/消费者场景设计,允许您将任何线程添加到集合(其作用类似于线程安全队列),以及一个(或多个)线程或任务调用blockingCollection.GetConsumingEnumerable()
以“消耗” “这些物品。
答案 1 :(得分:0)
你可以考虑使用TPL DataFlow设置一个ActionBlock<T>
,你可以从TCP线程中推送消息,然后TPL DataFlow会通过扩展动作的处理来处理其余的事情。你的硬件可以处理。您还可以通过使用ActionBlock<T>
配置MaxDegreeOfParallelism
来精确控制操作的处理量。
由于处理有时无法跟上传入数据的流量,您可能需要考虑在ActionBlock<T>
前面“链接”BufferBlock<T>
,以确保TCP处理线程不会“远远超出你实际处理的范围。这与使用有限容量的BlockingCollection<T>
具有相同的效果。
最后,请注意我链接到.NET 4.5文档,因为它最简单,但TPL DataFlow可用于.NET 4.0 via a separate download。不幸的是,他们从来没有制作过NuGet包。