Поделиться через


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>

Источник для инкапсулировать.

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

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

Комментарии

Для 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> (если применимо), или пользовательский блок.

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