DataflowBlock.Encapsulate<TInput,TOutput> Metod

Definition

Kapslar in ett mål och en källa i en enda spridning.

public:
generic <typename TInput, typename TOutput>
 static System::Threading::Tasks::Dataflow::IPropagatorBlock<TInput, TOutput> ^ Encapsulate(System::Threading::Tasks::Dataflow::ITargetBlock<TInput> ^ target, System::Threading::Tasks::Dataflow::ISourceBlock<TOutput> ^ source);
public static System.Threading.Tasks.Dataflow.IPropagatorBlock<TInput,TOutput> Encapsulate<TInput,TOutput>(System.Threading.Tasks.Dataflow.ITargetBlock<TInput> target, System.Threading.Tasks.Dataflow.ISourceBlock<TOutput> source);
static member Encapsulate : System.Threading.Tasks.Dataflow.ITargetBlock<'Input> * System.Threading.Tasks.Dataflow.ISourceBlock<'Output> -> System.Threading.Tasks.Dataflow.IPropagatorBlock<'Input, 'Output>
Public Function Encapsulate(Of TInput, TOutput) (target As ITargetBlock(Of TInput), source As ISourceBlock(Of TOutput)) As IPropagatorBlock(Of TInput, TOutput)

Typparametrar

TInput

Anger vilken typ av indata som förväntas av målet.

TOutput

Anger vilken typ av utdata som genereras av källan.

Parametrar

target
ITargetBlock<TInput>

Målet att kapsla in.

source
ISourceBlock<TOutput>

Källan som ska kapslas in.

Returer

Det inkapslade målet och källan.

Kommentarer

Metoden Encapsulate kräver två befintliga block: ett målblock (en instans av en klass som implementerar ITargetBlock<TInput>) och ett källblock (en instans av en klass som implementerar ISourceBlock<TOutput>). Encapsulate skapar en ny instans av en intern klass som ansluter gränssnittsmedlemmarna ITargetBlock<TInput> till parametern target och gränssnittsmedlemmarna ISourceBlock<TOutput> till parametern source . Både ITargetBlock<TInput> och ISourceBlock<TOutput> härleds från IDataflowBlock. Blockera slutförande skickas uttryckligen från källor till mål. Därför Complete är metoderna och Fault anslutna till målet medan Completion egenskapen är ansluten till källan. Du måste se till att när målhalvan är klar slutförs källhalvan på det lämpligaste sättet. till exempel:

target.Completion.ContinueWith(completion => source.Complete());

Om du vill sprida slutförandetypen kan du använda den här mer avancerade koden:

target.Completion.ContinueWith(completion => { if (completion.IsFaulted)

((IDataflowBlock)batchBlock).Fault(completion.Exception);
else
batchBlock.Complete();
});

Du måste också uttryckligen ange meddelandespridningen från mål till källa. Fördelen med den här explicita anslutningen är att den ger dig friheten att utföra obehindrat bearbetning mellan de två inkapslade blocken. Du kan göra det antingen genom att koda nödvändig bearbetning i blockens ombud (om blocken tar ombud) eller genom att bädda in ett undernätverk med block mellan dem. Det enklare sättet är att använda ett block som tar ombud; Använd ActionBlock<TInput>till exempel , TransformBlock<TInput,TOutput>, TransformManyBlock<TInput,TOutput> (om tillämpligt) eller ett anpassat block.

Gäller för