- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 block 最终从 TransformBlock 转到基于 LinkTo 谓词的其他三个转换 block 之一。我正在使用 DataflowLinkOptions 传播完成。问题是,当满足谓词并且启动该 block 时,我的管道的其余部分将继续。管道似乎应该先等待这个 block 完成。
代码是这样的:
var linkOptions = new DataflowLinkOptions {PropagateCompletion = true};
mainBlock.LinkTo(block1, linkOptions, x => x.Status = Status.Complete);
mainBlock.LinkTo(block2, linkOptions, x => x.Status = Status.Cancelled);
mainBlock.LinkTo(block3, linkOptions, x => x.Status = Status.Delayed);
mainBlock.LinkTo(DataflowBlock.NullTarget<Thing>(), linkOptions);
现在,这并不像我所说的那样工作,所以我发现获得我想要的行为的唯一方法是取出 linkOptions 并将以下内容添加到 mainBlock 的 lambda 中。
mainBlock = new TransformBlock<Thing,Thing>(input =>
{
DoMyStuff(input);
if (input.Status = Status.Complete)
{
mainBlock.Completion.ContinueWith(t => block1.Complete());
}
if (input.Status = Status.Cancelled)
{
mainBlock.Completion.ContinueWith(t => block2.Complete());
}
if (input.Status = Status.Delayed)
{
mainBlock.Completion.ContinueWith(t => block3.Complete());
}
return input;
});
那么问题来了,这是让它发挥作用的唯一方法吗?
顺便说一句,这已在我的单元测试中运行,其中运行了一个数据项以尝试调试管道行为。每个 block 都经过了多个单元测试的单独测试。所以在我的管道单元测试中发生的是断言在 block 完成执行之前命中,因此失败。
如果我删除 block2 和 block3 链接并使用 linkOptions 调试测试它工作正常。
最佳答案
您的问题不在于问题中的代码,它可以正常工作:当主 block 完成时,所有三个后续 block 也都被标记为完成。
问题出在结束 block :您也在那里使用 PropagateCompletion
,这意味着当前三个 block 中的任何完成时,结束 block 被标记完成。你想要的是在所有三个 block 都完成时将其标记为完成,并且你的答案中的 Task.WhenAll().ContinueWith()
组合做到了这一点(尽管该片段的第一部分是不必要的,那做与 PropagateCompletion
完全相同的事情)。
As it turns out, the link option propagation (at least this is my guess) will propagate the completion for blocks that don't satisfy the predicate in the linkTo.
是的,它总是传播完成。 Completion 没有任何与之关联的项目,因此将谓词应用于它没有任何意义。也许您总是只有一个项目(这并不常见)这一事实让您更加困惑?
If my guess is correct I sort of feel like this is bug or design error in the link option completion propagation. Why should a block be complete if it was never used?
为什么不呢?对我来说,这是完全合理的:即使这次没有带有 Status.Delayed
的项目,您仍然希望完成处理这些项目的 block ,以便任何后续代码可以知道所有延迟的项目都已处理。没有任何东西的事实并不重要。
无论如何,如果您经常遇到这种情况,您可能需要创建一个辅助方法,将多个源 block 同时链接到一个目标 block 并正确传播完成:
public static void LinkTo<T>(
this IReadOnlyCollection<ISourceBlock<T>> sources, ITargetBlock<T> target,
bool propagateCompletion)
{
foreach (var source in sources)
{
source.LinkTo(target);
}
if (propagateCompletion)
Task.WhenAll(sources.Select(source => source.Completion))
.ContinueWith(_ => target.Complete());
}
用法:
new[] { block1, block2, block3 }.LinkTo(endBlock, propagateCompletion: true);
关于c# - 使用 LinkTo 谓词的 TPL 数据流 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706708/
我有一个 TransformManyBlock并在运行时通过 LinkTo(...) 添加消费者 (ActionBlocks) . TransformManyBlock 是正确的数据流 block 来
我正在构建的这个 Emberjs 应用程序看起来全是船形,但出于某种原因,当我从“患者” View 点击 linkTo 时,Ember 会加载“患者” View ,但不会加载模型。但是,如果我在“/:
{{#linkTo "route" model title=model.title}}model.title{{/linkTo}} 这给出了结果 a标记“model.title”的标题值。我想迭代一个
在“TPL 数据流简介”中,Stephen Toub 在 LinkTo 下写道:“……如果不满足谓词,应该采取什么行为(例如,是否应该简单地删除这样的消息,是否应该拒绝这样的消息并将其提供给其他目标,
走以下路线: @resource 'settings', path: '/settings', -> @route 'alerts' 以及以下链接: {{#linkTo settings.inde
我有一个问题,当我单击我的页面 (LinkTo) 中的链接时,Ctrl + 单击,它会打开一个新选项卡,但控件会转到 chrome 中的下一个选项卡,而在 IE 中,控件停留在同一页面中。我发现 ch
嘿,不确定是否有人可以帮助我,但我已经为这个错误苦苦挣扎了很长时间: "Uncaught TypeError: Object has no method 'addArrayObserver'" 这是
有没有办法使用 link-to 动态生成链接通过传递带有路径路径的变量来帮助? 例如,不要像这样对路径进行硬编码: {{#linkTo "route.subroute" model}}{{model.
给定一个 BroadcastBlock如果缓冲区中有一条消息,是否可以防止将该消息发送到新链接的目标?例如: static void Main(string[] args) { var myB
更新应用程序包(Ember 从 rc6 到 1.0.0、handlebars 从 rc4 到 1.0.0、jquery 从 1.9.1 到 2.0.3)后,我的所有 linkTo 助手都停止工作;如果
如何在 {{#linkTo}} 帮助器上设置自定义 data- 属性?我想用这个: {{#linkTo "foo" data-toggle="dropdown"}}foo{{/linkTo}} 结果应
我正在使用 Handlebars 助手来解析一组对象,我希望将返回的结果包装在 #linkTo 调用中,以便 Embers 路由器将其接收。 这是我在 View 中的调用方式:{{buildBread
有没有办法替换触发 linkTo 和 Action 助手的默认事件? 我想响应 mousedown 而不是单击... 它是为了让界面工作得更快一点。 谢谢 最佳答案 Action 助手: 答案可以在官
我有一个博客网站,访问 url /posts 应该列出所有帖子。然后单击 /posts/:post_id 的链接应该会显示该帖子的详细信息。但是,单击链接时,linkTo 似乎没有正确传递 :post
我有一个 React Button 组件,当前有一个 prop,您可以在其中添加要链接的页面。 这工作正常,但我想添加一个名为“type”的新 Prop ,以便按钮可以链接到另一个页面(就像现在一样)
{{#each menuItem in menuItems}} {{#linkTo "dashboard.summary" menuItem}}{{menuItem
在 Handlebars 模板中使用 linkTo 帮助器时,Ember 在我添加到路由中的序列化程序的帮助下为链接设置了正确的 URL: serialize: function(slug, para
export default Ember.Component.extend({ tagName: '', actions: { checkUrl(post) { if(!E
我对 TPL 数据流这个话题还很陌生。在 C# 中的并发 一书中,我测试了以下示例。我不明白为什么没有应该是 2*2-2=2; 的输出 static void Main(string[] args)
我有一些 block 最终从 TransformBlock 转到基于 LinkTo 谓词的其他三个转换 block 之一。我正在使用 DataflowLinkOptions 传播完成。问题是,当满足谓
我是一名优秀的程序员,十分优秀!