数据流基础——块的解耦
问题
假设在执行处理时,需要动态地变更数据流的结构,这种高级场景极为罕见
解决方案
可以随时关联或解耦数据流块。数据可以通过网格自由地传送,任何时候关联或解耦都是安全的。并且,关联和解耦对线程来说也是安全的。
在关联数据流块时,保留LinkTo方法返回的IDisposable.在解耦数据流块时,则将其丢弃。
var multiplyBolck=new TransformBlock<int,int>(item=>item*2);
var subtractBlock=new TransformBlock<int,int>(item=>item-2);
IDisposable link=multiplyBolck.LinkTo(subtractBlock);
multiplyBlock.Post(1);
multiplyBlock.Post(2);
//解耦数据流块
//上面发送的数据可能已经通过链接,也可能尚未通过
//在实际应用中,考虑使用块来替代调用Dispose
link.Dispose();
讨论
除非讷讷够保证链接处于空闲状态,否则在解耦时可能会出现竞争条件。不过,通常无需担忧。在块完成解耦之前,数据可能流经链接,也可能并未流经。竞争条件并不会造成数据的重复或丢失。
要改变现有链接上的过滤器,就需要将旧链接解耦,并创建带有新过滤器的新链接(选择性地将DataflowLinkOptions.Append设为false.另一个例子是,有策略的解耦可以暂停数据流网格