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