DataflowBlock.Encapsulate<TInput,TOutput> Метод

Определение

Инкапсулирует целевой объект и источник в один блок распространения.

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)

Параметры типа

TInput

Указывает тип входных данных, ожидаемых целевым объектом.

TOutput

Указывает тип выходных данных, создаваемых источником.

Параметры

target
ITargetBlock<TInput>

Цель для инкапсуляции.

source
ISourceBlock<TOutput>

Источник для инкапсуляции.

Возвращаемое значение

IPropagatorBlock<TInput,TOutput>

Инкапсулированные исходный и конечный объекты.

Комментарии

Для Encapsulate этого метода требуются два существующих блока: целевой блок (экземпляр класса, реализующего ITargetBlock<TInput>) и исходный блок (экземпляр класса, реализующего ISourceBlock<TOutput>). Encapsulate создает новый экземпляр внутреннего класса, который соединяет ITargetBlock<TInput> члены интерфейса с параметром target и ISourceBlock<TOutput> элементами интерфейса к параметру source . Оба ITargetBlock<TInput> и ISourceBlock<TOutput> производные от IDataflowBlock. Завершение блока явно передается из источников в целевые объекты. Таким образом, Complete методы и Fault методы подключены к целевому объекту, пока Completion свойство подключено к источнику. Необходимо убедиться, что после завершения целевой половины исходная половина завершается наиболее подходящим образом; Например:

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

Или, если вы хотите распространить тип завершения, можно использовать этот более сложный код:

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

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

Кроме того, необходимо явно указать распространение сообщений из целевого объекта в источник. Преимущество этого явного соединения заключается в том, что это дает вам свободу выполнять любую неограничную обработку между двумя инкапсулированными блоками. Это можно сделать либо путем кодирования необходимой обработки в делегаты блоков (если блоки принимают делегаты), либо путем внедрения подсети блоков между ними. Проще использовать блок, который принимает делегаты; например, используйте ActionBlock<TInput>, TransformBlock<TInput,TOutput>TransformManyBlock<TInput,TOutput> (если применимо) или пользовательский блок.

Применяется к