# System.Threading.Tasks.Dataflow ``` diff +namespace System.Threading.Tasks.Dataflow { + public sealed class ActionBlock : IDataflowBlock, ITargetBlock { + public ActionBlock(Action action); + public ActionBlock(Action action, ExecutionDataflowBlockOptions dataflowBlockOptions); + public ActionBlock(Func action); + public ActionBlock(Func action, ExecutionDataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int InputCount { get; } + public void Complete(); + public bool Post(TInput item); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + } + public sealed class BatchBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public BatchBlock(int batchSize); + public BatchBlock(int batchSize, GroupingDataflowBlockOptions dataflowBlockOptions); + public int BatchSize { get; } + public Task Completion { get; } + public int OutputCount { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + T[] System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public void TriggerBatch(); + public bool TryReceive(Predicate filter, out T[] item); + public bool TryReceiveAll(out IList items); + } + public sealed class BatchedJoinBlock : IDataflowBlock, IReceivableSourceBlock, IList>>, ISourceBlock, IList>> { + public BatchedJoinBlock(int batchSize); + public BatchedJoinBlock(int batchSize, GroupingDataflowBlockOptions dataflowBlockOptions); + public int BatchSize { get; } + public Task Completion { get; } + public int OutputCount { get; } + public ITargetBlock Target1 { get; } + public ITargetBlock Target2 { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock, IList>> target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + Tuple, IList> System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList>>.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock, IList>> target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList>>.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock, IList>> target); + bool System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList>>.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock, IList>> target); + public override string ToString(); + public bool TryReceive(Predicate, IList>> filter, out Tuple, IList> item); + public bool TryReceiveAll(out IList, IList>> items); + } + public sealed class BatchedJoinBlock : IDataflowBlock, IReceivableSourceBlock, IList, IList>>, ISourceBlock, IList, IList>> { + public BatchedJoinBlock(int batchSize); + public BatchedJoinBlock(int batchSize, GroupingDataflowBlockOptions dataflowBlockOptions); + public int BatchSize { get; } + public Task Completion { get; } + public int OutputCount { get; } + public ITargetBlock Target1 { get; } + public ITargetBlock Target2 { get; } + public ITargetBlock Target3 { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock, IList, IList>> target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + Tuple, IList, IList> System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock, IList, IList>> target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock, IList, IList>> target); + bool System.Threading.Tasks.Dataflow.ISourceBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock, IList, IList>> target); + public override string ToString(); + public bool TryReceive(Predicate, IList, IList>> filter, out Tuple, IList, IList> item); + public bool TryReceiveAll(out IList, IList, IList>> items); + } + public sealed class BroadcastBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public BroadcastBlock(Func cloningFunction); + public BroadcastBlock(Func cloningFunction, DataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + bool System.Threading.Tasks.Dataflow.IReceivableSourceBlock.TryReceiveAll(out IList items); + T System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public bool TryReceive(Predicate filter, out T item); + } + public sealed class BufferBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public BufferBlock(); + public BufferBlock(DataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int Count { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + T System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public bool TryReceive(Predicate filter, out T item); + public bool TryReceiveAll(out IList items); + } + public static class DataflowBlock { + public static IObservable AsObservable(this ISourceBlock source); + public static IObserver AsObserver(this ITargetBlock target); + public static Task Choose(ISourceBlock source1, Action action1, ISourceBlock source2, Action action2, ISourceBlock source3, Action action3); + public static Task Choose(ISourceBlock source1, Action action1, ISourceBlock source2, Action action2, ISourceBlock source3, Action action3, DataflowBlockOptions dataflowBlockOptions); + public static Task Choose(ISourceBlock source1, Action action1, ISourceBlock source2, Action action2); + public static Task Choose(ISourceBlock source1, Action action1, ISourceBlock source2, Action action2, DataflowBlockOptions dataflowBlockOptions); + public static IPropagatorBlock Encapsulate(ITargetBlock target, ISourceBlock source); + public static IDisposable LinkTo(this ISourceBlock source, ITargetBlock target); + public static IDisposable LinkTo(this ISourceBlock source, ITargetBlock target, Predicate predicate); + public static IDisposable LinkTo(this ISourceBlock source, ITargetBlock target, DataflowLinkOptions linkOptions, Predicate predicate); + public static ITargetBlock NullTarget(); + public static Task OutputAvailableAsync(this ISourceBlock source); + public static Task OutputAvailableAsync(this ISourceBlock source, CancellationToken cancellationToken); + public static bool Post(this ITargetBlock target, TInput item); + public static TOutput Receive(this ISourceBlock source); + public static TOutput Receive(this ISourceBlock source, CancellationToken cancellationToken); + public static TOutput Receive(this ISourceBlock source, TimeSpan timeout); + public static TOutput Receive(this ISourceBlock source, TimeSpan timeout, CancellationToken cancellationToken); + public static Task ReceiveAsync(this ISourceBlock source); + public static Task ReceiveAsync(this ISourceBlock source, CancellationToken cancellationToken); + public static Task ReceiveAsync(this ISourceBlock source, TimeSpan timeout); + public static Task ReceiveAsync(this ISourceBlock source, TimeSpan timeout, CancellationToken cancellationToken); + public static Task SendAsync(this ITargetBlock target, TInput item); + public static Task SendAsync(this ITargetBlock target, TInput item, CancellationToken cancellationToken); + public static bool TryReceive(this IReceivableSourceBlock source, out TOutput item); + } + public class DataflowBlockOptions { + public const int Unbounded = -1; + public DataflowBlockOptions(); + public int BoundedCapacity { get; set; } + public CancellationToken CancellationToken { get; set; } + public bool EnsureOrdered { get; set; } + public int MaxMessagesPerTask { get; set; } + public string NameFormat { get; set; } + public TaskScheduler TaskScheduler { get; set; } + } + public class DataflowLinkOptions { + public DataflowLinkOptions(); + public bool Append { get; set; } + public int MaxMessages { get; set; } + public bool PropagateCompletion { get; set; } + } + public readonly struct DataflowMessageHeader : IEquatable { + public DataflowMessageHeader(long id); + public long Id { get; } + public bool IsValid { get; } + public override bool Equals(object obj); + public bool Equals(DataflowMessageHeader other); + public override int GetHashCode(); + public static bool operator ==(DataflowMessageHeader left, DataflowMessageHeader right); + public static bool operator !=(DataflowMessageHeader left, DataflowMessageHeader right); + } + public enum DataflowMessageStatus { + Accepted = 0, + Declined = 1, + DecliningPermanently = 4, + NotAvailable = 3, + Postponed = 2, + } + public class ExecutionDataflowBlockOptions : DataflowBlockOptions { + public ExecutionDataflowBlockOptions(); + public int MaxDegreeOfParallelism { get; set; } + public bool SingleProducerConstrained { get; set; } + } + public class GroupingDataflowBlockOptions : DataflowBlockOptions { + public GroupingDataflowBlockOptions(); + public bool Greedy { get; set; } + public long MaxNumberOfGroups { get; set; } + } + public interface IDataflowBlock { + Task Completion { get; } + void Complete(); + void Fault(Exception exception); + } + public interface IPropagatorBlock : IDataflowBlock, ISourceBlock, ITargetBlock + public interface IReceivableSourceBlock : IDataflowBlock, ISourceBlock { + bool TryReceive(Predicate filter, out TOutput item); + bool TryReceiveAll(out IList items); + } + public interface ISourceBlock : IDataflowBlock { + TOutput ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + } + public interface ITargetBlock : IDataflowBlock { + DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock source, bool consumeToAccept); + } + public sealed class JoinBlock : IDataflowBlock, IReceivableSourceBlock>, ISourceBlock> { + public JoinBlock(); + public JoinBlock(GroupingDataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int OutputCount { get; } + public ITargetBlock Target1 { get; } + public ITargetBlock Target2 { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock> target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + Tuple System.Threading.Tasks.Dataflow.ISourceBlock>.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock> target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock>.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock> target); + bool System.Threading.Tasks.Dataflow.ISourceBlock>.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock> target); + public override string ToString(); + public bool TryReceive(Predicate> filter, out Tuple item); + public bool TryReceiveAll(out IList> items); + } + public sealed class JoinBlock : IDataflowBlock, IReceivableSourceBlock>, ISourceBlock> { + public JoinBlock(); + public JoinBlock(GroupingDataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int OutputCount { get; } + public ITargetBlock Target1 { get; } + public ITargetBlock Target2 { get; } + public ITargetBlock Target3 { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock> target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + Tuple System.Threading.Tasks.Dataflow.ISourceBlock>.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock> target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock>.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock> target); + bool System.Threading.Tasks.Dataflow.ISourceBlock>.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock> target); + public override string ToString(); + public bool TryReceive(Predicate> filter, out Tuple item); + public bool TryReceiveAll(out IList> items); + } + public sealed class TransformBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public TransformBlock(Func> transform); + public TransformBlock(Func> transform, ExecutionDataflowBlockOptions dataflowBlockOptions); + public TransformBlock(Func transform); + public TransformBlock(Func transform, ExecutionDataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int InputCount { get; } + public int OutputCount { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + TOutput System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public bool TryReceive(Predicate filter, out TOutput item); + public bool TryReceiveAll(out IList items); + } + public sealed class TransformManyBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public TransformManyBlock(Func> transform); + public TransformManyBlock(Func> transform, ExecutionDataflowBlockOptions dataflowBlockOptions); + public TransformManyBlock(Func>> transform); + public TransformManyBlock(Func>> transform, ExecutionDataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public int InputCount { get; } + public int OutputCount { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + TOutput System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public bool TryReceive(Predicate filter, out TOutput item); + public bool TryReceiveAll(out IList items); + } + public sealed class WriteOnceBlock : IDataflowBlock, IPropagatorBlock, IReceivableSourceBlock, ISourceBlock, ITargetBlock { + public WriteOnceBlock(Func cloningFunction); + public WriteOnceBlock(Func cloningFunction, DataflowBlockOptions dataflowBlockOptions); + public Task Completion { get; } + public void Complete(); + public IDisposable LinkTo(ITargetBlock target, DataflowLinkOptions linkOptions); + void System.Threading.Tasks.Dataflow.IDataflowBlock.Fault(Exception exception); + bool System.Threading.Tasks.Dataflow.IReceivableSourceBlock.TryReceiveAll(out IList items); + T System.Threading.Tasks.Dataflow.ISourceBlock.ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock target, out bool messageConsumed); + void System.Threading.Tasks.Dataflow.ISourceBlock.ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock target); + bool System.Threading.Tasks.Dataflow.ISourceBlock.ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock target); + DataflowMessageStatus System.Threading.Tasks.Dataflow.ITargetBlock.OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock source, bool consumeToAccept); + public override string ToString(); + public bool TryReceive(Predicate filter, out T item); + } +} ```