Condividi tramite


DataflowBlock.Encapsulate<TInput,TOutput> Metodo

Definizione

Incapsula una destinazione e un'origine in un unico 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 dal blocco di 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 che ITargetBlock<TInput>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 quando la metà di destinazione viene completata, 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 specificare in modo esplicito la propagazione dei messaggi dalla destinazione all'origine. Il vantaggio di questa connessione esplicita è che consente di eseguire qualsiasi elaborazione senza vincoli 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