Compartir a través de


DataflowBlock.Encapsulate<TInput,TOutput> Método

Definición

Encapsula un destino y un origen en un ú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 el tipo de entrada que se espera en el destino.

TOutput

Especifica el tipo de salida generado por el origen.

Parámetros

target
ITargetBlock<TInput>

Destino que se va a encapsular.

source
ISourceBlock<TOutput>

Origen que se va a encapsular.

Devoluciones

Destino y origen encapsulados.

Comentarios

El Encapsulate método requiere dos bloques existentes: un bloque de destino (una instancia de una clase que implementa ITargetBlock<TInput>) y un bloque de origen (una instancia de una clase que implementa ISourceBlock<TOutput>). Encapsulate crea una nueva instancia de una clase interna que conecta los miembros de la ITargetBlock<TInput> interfaz con el target parámetro y los ISourceBlock<TOutput> miembros de la interfaz con el source parámetro . Tanto ITargetBlock<TInput> como ISourceBlock<TOutput> derivan de IDataflowBlock. La finalización de bloques se pasa explícitamente de orígenes a destinos. Por lo tanto, los Complete métodos y Fault se conectan al destino mientras la Completion propiedad está conectada al origen. Debe asegurarse de que cuando se completa la mitad de destino, la mitad de origen se completa de la manera más adecuada; por ejemplo:

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

O bien, si desea propagar el tipo de finalización, puede usar este código más sofisticado:

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

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

También debe proporcionar explícitamente la propagación de mensajes del destino al origen. La ventaja de esta conexión explícita es que ofrece la libertad de realizar cualquier procesamiento sin restricciones entre los dos bloques encapsulados. Puede hacerlo mediante la codificación del procesamiento necesario en los delegados de los bloques (si los bloques toman delegados) o mediante la inserción de una subred de bloques entre ellos. La manera más fácil es usar un bloque que toma delegados; por ejemplo, use ActionBlock<TInput>, TransformBlock<TInput,TOutput>TransformManyBlock<TInput,TOutput> , (si procede) o un bloque personalizado.

Se aplica a