Sdílet prostřednictvím


DataflowBlock.Encapsulate<TInput,TOutput> Metoda

Definice

Zapouzdřuje cíl a zdroj do jednoho šíření.

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)

Parametry typu

TInput

Určuje typ vstupu očekávaného cílem.

TOutput

Určuje typ výstupu vytvořeného zdrojem.

Parametry

target
ITargetBlock<TInput>

Cíl zapouzdření.

source
ISourceBlock<TOutput>

Zdroj, který se zapouzdřuje.

Návraty

Zapouzdřený cíl a zdroj.

Poznámky

Metoda Encapsulate vyžaduje dva existující bloky: cílový blok (instanci třídy, která implementuje ITargetBlock<TInput>) a zdrojový blok (instanci třídy, která implementuje ISourceBlock<TOutput>). Encapsulate vytvoří novou instanci interní třídy, která spojuje ITargetBlock<TInput> členy rozhraní s parametrem target a ISourceBlock<TOutput> členy rozhraní s parametrem source . Oba ITargetBlock<TInput> a ISourceBlock<TOutput> odvozovat z IDataflowBlock. Doplňování bloku se explicitně předává ze zdrojů do cílů. Complete Proto jsou a Fault metody připojeny k cíli, zatímco Completion vlastnost je připojena ke zdroji. Je nutné zajistit, aby se po dokončení cílové poloviny zdrojová polovina dokončila nejvhodnějším způsobem; Například:

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

Nebo pokud chcete rozšířit typ dokončení, můžete použít tento sofistikovanější kód:

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

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

Musíte také explicitně zadat šíření zpráv z cíle do zdroje. Výhodou tohoto explicitního připojení je, že vám dává svobodu provádět jakékoli nekontrénované zpracování mezi těmito dvěma zapouzdřenými bloky. Můžete to provést buď kódováním potřebného zpracování do delegátů bloků (pokud bloky přebírají delegáty), nebo vložením podsítě bloků mezi nimi. Jednodušší způsob je použít blok, který přebírá delegáty; Například použijte ActionBlock<TInput>, , TransformBlock<TInput,TOutput>( TransformManyBlock<TInput,TOutput> pokud je k dispozici) nebo vlastní blok.

Platí pro