【发布时间】:2014-07-09 13:12:34
【问题描述】:
我需要一个 Dataflow 块,它根据消息中的时间戳 (LogEntry) 将消息转发到下一个块。
这是我想出的,但感觉不对。有什么改进建议吗?
private IPropagatorBlock<LogEntry, LogEntry> DelayedForwardBlock()
{
var buffer = new ConcurrentQueue<LogEntry>();
var source = new BufferBlock<LogEntry>();
var target = new ActionBlock<LogEntry>(item =>
{
buffer.Enqueue(item);
});
Task.Run(() =>
{
LogEntry entry;
while (true)
{
entry = null;
if (buffer.TryPeek(out entry))
{
if (entry.UtcTimestamp < (DateTime.UtcNow - TimeSpan.FromMinutes(5)))
{
buffer.TryDequeue(out entry);
source.Post(entry);
}
}
}
});
target.Completion.ContinueWith(delegate
{
LogEntry entry;
while (buffer.TryDequeue(out entry))
{
source.Post(entry);
}
source.Complete();
});
return DataflowBlock.Encapsulate(target, source);
}
【问题讨论】:
-
如果您的代码有效,那么这可能更适合codereview.stackexchange.com。
标签: c# .net task-parallel-library tpl-dataflow