【发布时间】:2013-01-22 03:10:33
【问题描述】:
使用 TPL,我如何从多个 IO 源(“无线程”任务)收集结果,并在它们从各自的源进来时将它们合并成一个序列,而不为每个源生成一个基于线程的任务来监控它们?从一个线程轮询源是否安全?
while (true)
{
try
{
IEnumerable<UdpClient> readyChannels =
from channel in channels
where channel.Available > 0
select channel;
foreach( UdpClient channel in readyChannels)
{
var result = await channel.ReceiveAsync();
//do something with result like post to dataflow block.
}
}
catch (Exception e)
{
throw (e);
}
...
这样的事情怎么样?
【问题讨论】:
-
这里真的需要while循环吗?只是好奇
-
@Cuong Le - 我想不断地轮询和阅读我的 udp 来源。
-
可以用
Task.WhenAny或类似的结构来做这种事情,但我认为更好的匹配是为每个UdpClient公开IObservable或ISourceBlock。 Rx 或 TPL 数据流更适合像这样的“推送”事件。 -
@Stephen C - IObservable/ISourceBlock 火花线程。我需要从一个线程收集所有数据,而不是多个线程监控不同的来源,因为有很多来源。
-
上面的代码在它自己的线程中执行,但是每个源都应该从那个线程监控,而不是创建一个新的线程/每个源。我正在尝试保存线程。
标签: c# io task-parallel-library tpl-dataflow