Compartilhar via


DataflowBlock.Encapsulate<TInput,TOutput> Método

Definição

Encapsula um destino e uma origem em um único propagador.

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)

Parâmetros de tipo

TInput

Especifica o tipo de entrada esperado pelo destino.

TOutput

Especifica o tipo de saída produzido pela origem.

Parâmetros

target
ITargetBlock<TInput>

O destino a ser encapsulado.

source
ISourceBlock<TOutput>

A origem a ser encapsulada.

Retornos

O destino e a origem encapsulados.

Comentários

O Encapsulate método requer dois blocos existentes: um bloco de destino (uma instância de uma classe que implementa ITargetBlock<TInput>) e um bloco de origem (uma instância de uma classe que implementa ISourceBlock<TOutput>). Encapsulate cria uma nova instância de uma classe interna que conecta os membros da ITargetBlock<TInput> interface ao target parâmetro e aos membros da ISourceBlock<TOutput> interface ao source parâmetro . ISourceBlock<TOutput> E ITargetBlock<TInput> derivam de IDataflowBlock. A conclusão do bloco é explicitamente passada de fontes para destinos. Portanto, os Complete métodos e Fault são conectados ao destino enquanto a Completion propriedade está conectada à origem. Você deve garantir que, quando a metade de destino for concluída, a metade de origem seja concluída da maneira mais apropriada; por exemplo:

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

Ou, se você quiser propagar o tipo de conclusão, poderá usar este código mais sofisticado:

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

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

Você também deve fornecer explicitamente a propagação de mensagem de destino para origem. O benefício dessa conexão explícita é que ela lhe dá a liberdade de executar qualquer processamento não treinado entre os dois blocos encapsulados. Você pode fazer isso codificando o processamento necessário nos delegados dos blocos (se os blocos levarem delegados) ou inserindo uma sub-rede de blocos entre eles. A maneira mais fácil é usar um bloco que leve delegados; por exemplo, use ActionBlock<TInput>, TransformBlock<TInput,TOutput>, TransformManyBlock<TInput,TOutput> (se aplicável) ou um bloco personalizado.

Aplica-se a