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