如何在TPL Dataflow中设置/获取/使用块的名称?

9
MSDN文档显示 DataflowBlockOptions 类中有一个 NameFormat 属性,描述如下:

获取或设置查询块名称时要使用的格式字符串。

那么...如何设置名称?名称在何处可用?什么时候使用?
还是...如我所料...这只是未实现的设计残留吗?

1
我没有测试过这个 - 但是这不是在文档中有记录吗: "名称格式可以包含最多两个格式项。{0}将被替换为块的名称。{1}将被替换为块的Id,就像从块的Completion.Id属性返回的那样。" - http://msdn.microsoft.com/en-us/library/system.threading.tasks.dataflow.dataflowblockoptions.nameformat(v=vs.110).aspx - Random Dev
嗯,这有点尴尬,但是看到DataflowBlockOptions的属性页面时,我没有想到点击NameFormat来查看那个页面说了什么,因为在那里对我来说看起来已经很完整了。现在我明白了! - davidbak
1个回答

10
您没有设置名称,而是设置一个NameFormat,最终将导致生成一个名称(您当然可以忽略参数并设置任何您想要的名称,如NameFormat = "bar")。您可以使用ToString获取名称,例如:
var block = new ActionBlock<int>(_ => { }, new ExecutionDataflowBlockOptions
{
    NameFormat = "The name format may contain up to two format items. {0} will be substituted with the block's name. {1} will be substituted with the block's Id, as is returned from the block's Completion.Id property."
});

Console.WriteLine(block.ToString());

输出:

名称格式可以包含最多两个格式项。ActionBlock`1将被替换为块的名称。1将被替换为块的Id,就像从块的Completion.Id属性返回的那样。


如果我们查看.Net Core上的源代码ToString实现基本上是:

return string.Format(options.NameFormat, block.GetType().Name, block.Completion.Id);

啊!它不是块的某个用户定义标识符...它就像类名一样。因此...你无法通过这种方式区分你创建的不同块,比如TransformBlock,除非通过它们的数字ID。而数据流块是密封的(这总是让我很烦恼),所以你不能通过派生来修改它。谢谢! - davidbak
@davidbak 在我看来,一个数字Id是最好的区分项,但是没错。 - i3arnon
2
天啊,我刚用线索棒敲了自己的头,终于明白你想告诉我的了。谢谢! - davidbak
@i3arnon,您使用数字ID来区分块是什么意思?据我所知,与特定块相关联的完成ID可能会更改,我错了吗?我实现了一个简单的类来帮助构建数据流管道,该类仅公开创建的IDataflowBlock列表。我试图找到一种方法来测试这个类,以确保每个块都是我创建的那个。我唯一能想到的就是使用ToString并将其与我给它的NameFormat进行比较。 - João Gonçalves
@JoãoGonçalves 根据我所知,与块实例相关联的ID不会改变。如果您创建另一个实例,则会获得不同的ID。 - i3arnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接