C# TPL.数据流消息处理超时?

C# TPL.数据流消息处理超时?,c#,task-parallel-library,tpl-dataflow,C#,Task Parallel Library,Tpl Dataflow,使用.NET TPL数据流块。 有没有办法使消息处理超时 e、 g 假设我有一个缓冲块,是否可以将其链接到另一个一次处理一条消息的块(MaxDegreeOfParallellism1),并在处理时间过长时强制超时? 或者甚至可以只使用缓冲块吗 我怀疑我可以以某种方式使用取消令牌和延迟,但不确定如何做到这一点。 还有,这样的超时会有多贵?它会给消息处理时间增加很多开销吗?许多BufferBlock方法都接受CancellationToken,我相信这是超时操作的正确方法。例如: var cts =

使用.NET TPL数据流块。 有没有办法使消息处理超时

e、 g

假设我有一个
缓冲块
,是否可以将其链接到另一个一次处理一条消息的块(
MaxDegreeOfParallellism
1),并在处理时间过长时强制超时? 或者甚至可以只使用缓冲块吗

我怀疑我可以以某种方式使用取消令牌和延迟,但不确定如何做到这一点。
还有,这样的超时会有多贵?它会给消息处理时间增加很多开销吗?

许多
BufferBlock
方法都接受
CancellationToken
,我相信这是超时操作的正确方法。例如:

var cts = new CancellationTokenSource(5000); // cancel in 5s 
// Alternatively: cts.CancelAfter(5000);

try 
{
    var output = await bufferBlock.ReceiveAsync(cts.Token);
}
catch (Exception ex)
{
    // check if ex is OperationCanceledException,
    // which could be wrapped with AggregateException 
}
在IMO看来,评估其效率的唯一方法是运行一些分析测试

[UPDATE]根据评论,如果您希望暂停管道处理,您可能可以在构建
ActionBlock
对象并为其提供
ExecutionDataflowBlockOptions
的实例时完成此操作。在这一点上,您可以以与上述相同的方式提供和使用它。此外,您还可以将
CancellationToken
作为
DataflowLinkOptions
的一部分传递到
LinkTo

一旦为管道提供了
取消令牌
,您就可以跟踪/
TransformBlock.Completion的状态,这是一项
任务
,因此您可以
等待
并捕获取消异常,或者对其使用
ContinueWith
(如果这是您在某种方式下的意思,以判断消息的“处理”超时)


免责声明:我自己没有尝试过,我很想知道它是否能按预期工作。

我认为没有内置超时。如果您只想过滤这些项目,而不只是为了给其他项目腾出空间而删除,则可以创建一个块。您所说的“强制超时”到底是什么意思?您正在尝试吗?(我说的是你的处理代码,不是数据流中的任何东西。)谢谢,但是如果接收超时,上面的代码将被取消,我需要一些方法来判断“处理"但是,如果我通过我的处理器将消息转发给另一个处理器,那么这可能是类似的block@RogerAlsing,我想是的。你可能可以利用
令牌。注册
和/或
创建LinkedTokenSource
。也许你可以展示一个处理代码的草图。代码t should timeout位于这里突出显示的行上:我在这里使用bufferblock作为可观察的对象,但这不是一个要求,我只想在收到来自bufferblock的消息后调用“onNext”,如果它执行时间超过x,则抛出