次の方法で共有


PipelineComponent.IsInputReady メソッド

コンポーネントにアタッチされている入力のうち、どの入力がデータを待っているか、およびどの入力が十分な処理対象のデータを持ちながらブロックされているかを判定します。

名前空間:  Microsoft.SqlServer.Dts.Pipeline
アセンブリ:  Microsoft.SqlServer.PipelineHost (Microsoft.SqlServer.PipelineHost.dll)

構文

'宣言
Public Overridable Sub IsInputReady ( _
    inputIDs As Integer(), _
    ByRef canProcess As Boolean() _
)
'使用
Dim instance As PipelineComponent 
Dim inputIDs As Integer()
Dim canProcess As Boolean()

instance.IsInputReady(inputIDs, canProcess)
public virtual void IsInputReady(
    int[] inputIDs,
    ref bool[] canProcess
)
public:
virtual void IsInputReady(
    array<int>^ inputIDs, 
    array<bool>^% canProcess
)
abstract IsInputReady : 
        inputIDs:int[] * 
        canProcess:bool[] byref -> unit  
override IsInputReady : 
        inputIDs:int[] * 
        canProcess:bool[] byref -> unit
public function IsInputReady(
    inputIDs : int[], 
    canProcess : boolean[]
)

パラメーター

  • inputIDs
    型: array<System.Int32[]
    コンポーネントにアタッチされている入力の ID の配列です。
  • canProcess
    型: array<System.Boolean[]%
    各入力が追加のデータを待っているか (true)、またはブロックされているか (false) を示す、参照渡しされたブール値の配列です。

説明

DtsPipelineComponentAttributeDtsPipelineComponentAttribute.SupportsBackPressure プロパティの値を true に設定する場合は、IsInputReady メソッドも実装する必要があります。

データ フロー エンジンは、IsInputReady メソッドを呼び出して、どの入力が追加のデータを待っているかを判定します。 このメソッドの実装では、コンポーネントの各入力の状態を Boolean 型の canProcess 配列に設定します (入力は inputIDs 配列内の ID 値によって識別されます)。canProcess 配列で入力の値を true に設定すると、データ フロー エンジンは、コンポーネントの ProcessInput メソッドを呼び出し、指定された入力に対して追加のデータを提供します。

追加の上流データを使用できるときは、canProcess 配列内で 1 つ以上の入力の値を常に true に設定する必要があります。そうでないと、処理が停止します。

カスタム データ フロー コンポーネントの複数の入力によってデータが不均一なレートで生成される場合に過度なメモリ消費を処理する方法の詳細については、「複数の入力を持つデータ フロー コンポーネントの開発」を参照してください。

使用例

次の例では、IsInputReady の実装により、以下の条件に該当する場合に入力が追加のデータを待っていることを示します。

  • 入力に対する追加の上流データがある (!inputEOR)。

  • コンポーネントが、受信済みのバッファーで入力に対して処理できるデータを現在持っていない (inputBuffers[inputIndex].CurrentRow() == null)。

入力が追加のデータを待っている場合、データ フロー コンポーネントは、この入力に対応する canProcess 配列の要素の値を true に設定することによってこの状態を示します。

逆に、コンポーネントが入力に対して処理できるデータを持っている場合、この例では入力の処理を中断します。 この例では、入力に対応する 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];
    }
}

前の例は、Boolean 型の inputEOR 配列を使用して、各入力で追加のアップストリーム データを使用できるかどうかを示します。 配列名の EOR は "行セットの末尾 (end of rowset)" を示し、データ フロー バッファーの EndOfRowset プロパティを参照します。 ここに含まれていない例の部分では、ProcessInput メソッドを使用して、受信するデータの各バッファーに対して EndOfRowset プロパティの値を確認します。 値 true によって入力に対してこれ以上の上流データがないことが示された場合、この例では、その入力の inputEOR の値を true に設定します。 IsInputReady メソッドのこの実装では、入力に対する上流データがこれ以上ないことが inputEOR の値によって示された場合に、入力に対する canProcess 配列の対応する値を false に設定します。

関連項目

参照

PipelineComponent クラス

Microsoft.SqlServer.Dts.Pipeline 名前空間