PipelineComponent.IsInputReady(Int32[], Boolean[]) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
确定连接到组件的输入中哪些正在等待更多数据,哪些有足够的数据需要处理而被阻塞。
public:
virtual void IsInputReady(cli::array <int> ^ inputIDs, cli::array <bool> ^ % canProcess);
public virtual void IsInputReady(int[] inputIDs, ref bool[] canProcess);
abstract member IsInputReady : int[] * Boolean[] -> unit
override this.IsInputReady : int[] * Boolean[] -> unit
Public Overridable Sub IsInputReady (inputIDs As Integer(), ByRef canProcess As Boolean())
参数
- inputIDs
- Int32[]
一个由输入ID组成的数组,这些输入连接到组件。
- canProcess
- Boolean[]
一个布尔值数组,表示每个输入是否在等待更多数据(true),还是阻塞(false),通过引用传递。
示例
在以下示例中,方法的实现 IsInputReady 表明输入在以下条件成立时正在等待接收更多数据:
输入()有更多上游数据可用
!inputEOR。组件目前没有可用于处理其已接收到的缓冲区输入的数据(
inputBuffers[inputIndex].CurrentRow() == null)。
如果输入在等待接收更多数据,数据流分量会通过将 true 该输入对应的数组元素 canProcess 值设置为表示。
相反,当组件仍有数据可用以处理输入时,示例会暂停输入的处理。 示例通过将数组中canProcess对应该输入的元素值设置为false实现这一点。
public override void IsInputReady(int[] inputIDs, ref bool[] canProcess)
{
for (int i = 0; i < inputIDs.Length; i++)
{
int inputIndex = ComponentMetaData.InputCollection.GetObjectIndexByID(inputIDs[i]);
canProcess[i] = (inputBuffers[inputIndex].CurrentRow() == null)
&& !inputEOR[inputIndex];
}
}
前例使用布尔 inputEOR 数组来表示每个输入是否有更多上游数据可用。
EOR 数组名称中表示“行集结束”,指的是 EndOfRowset 数据流缓冲区的性质。 在示例中未包含的部分, ProcessInput 方法检查每个缓冲区数据的属性值 EndOfRowset 。 当值 表示 true 输入上游数据已无时,示例将 的 inputEOR 值设为该 true 输入的值。 该方法的实现 IsInputReady 将数组中的对应值 canProcess 设置为, false 当该 inputEOR 输入的值表示该输入没有更多上游数据可用时。
注解
当你将属性trueDtsPipelineComponentAttribute的值Microsoft.SqlServer.Dts.Pipeline.DtsPipelineComponentAttribute.SupportsBackPressure设置为 时,你还必须提供该方法的IsInputReady实现。
数据流引擎调用该 IsInputReady 方法来确定哪些输入正在等待接收更多数据。 在你实现该方法时,你设置了每个组件输入在布尔 canProcess 数组中的状态。 (输入通过数组中的inputIDsID值来识别。)当你在数组中将输入值设置为时truecanProcess,数据流引擎调用组件的方法ProcessInput,并为指定输入提供更多数据。
虽然有更多上游数据可用,但至少一个输入的值必须始终在 true 数组中 canProcess ,否则处理会停止。
关于当自定义 data flow 组件的输入产生数据速率不均时,如何处理过多内存使用的更多信息,请参见《Developing 数据流 Components with Multiple Inputs》。