Condividi tramite


DataflowBlock.Encapsulate<TInput,TOutput> Metodo

Definizione

Incapsula una destinazione e un'origine in un singolo propagatore.

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)

Parametri di tipo

TInput

Specifica il tipo di input previsto dalla destinazione.

TOutput

Specifica il tipo di output prodotto dall'origine.

Parametri

target
ITargetBlock<TInput>

Destinazione da incapsulare.

source
ISourceBlock<TOutput>

Origine da incapsulare.

Restituisce

Destinazione e origine incapsulate.

Commenti

Il Encapsulate metodo richiede due blocchi esistenti: un blocco di destinazione (un'istanza di una classe che implementa ITargetBlock<TInput>) e un blocco di origine (un'istanza di una classe che implementa ISourceBlock<TOutput>). Encapsulate crea una nuova istanza di una classe interna che connette i membri dell'interfaccia ITargetBlock<TInput> al target parametro e i membri dell'interfaccia ISourceBlock<TOutput> al source parametro . Sia ITargetBlock<TInput> che ISourceBlock<TOutput> derivano da IDataflowBlock. Il completamento del blocco viene passato in modo esplicito dalle origini alle destinazioni. Pertanto, i Complete metodi e Fault sono connessi alla destinazione mentre la Completion proprietà è connessa all'origine. È necessario assicurarsi che al termine della metà di destinazione, la metà dell'origine viene completata nel modo più appropriato; Per esempio:

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

In alternativa, se si vuole propagare il tipo di completamento, è possibile usare questo codice più sofisticato:

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

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

È inoltre necessario fornire in modo esplicito la propagazione dei messaggi dalla destinazione all'origine. Il vantaggio di questa connessione esplicita è che consente di eseguire qualsiasi elaborazione non vincolata tra i due blocchi incapsulati. È possibile eseguire questa operazione codificando l'elaborazione necessaria nei delegati dei blocchi (se i blocchi accettano delegati) o incorporando una rete secondaria di blocchi tra di essi. Il modo più semplice consiste nell'usare un blocco che accetta delegati; ad esempio, usare ActionBlock<TInput>, TransformBlock<TInput,TOutput>TransformManyBlock<TInput,TOutput> (se applicabile) o un blocco personalizzato.

Si applica a