如何使用TPL封送C#中特定线程的调用

时间:2012-08-13 16:05:52

标签: c# multithreading task task-parallel-library

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

那么问题是这个。我应该如何最好地管理创建,配置(线程名称,后台等)生命周期,以及使用任务库对这些线程的调用进行编组?我有点熟悉使用Thread类型明确地做这个,但是当我的公司尽可能地通过使用Task来做我们可以做的事情。

编辑:我相信我需要的是基于消费者类型的SynchronizationContext,确保任务是与该上下文相关联的单个线程上的调度。

2 个答案:

答案 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包。