マネージド ストリーミング パイプライン コンポーネントでの Seek メソッドの実装
ネイティブ IStream インターフェイスは、現在のストリーム位置をチェックするメソッドを提供しないため、メッセージング エンジンは次の Seek メソッドを使用します。
pStream->Seek(0, STREAM_SEEK_CUR, &pNewPosition);
このメソッドはストリーム ポインターを移動するのではなく、現在の位置を問い合わせます。 そのため、参照できないストリームで動作するパイプライン コンポーネントを実装する場合は、次の例のように Stream.Seek メソッドを使用できます。
例
override public long Seek(long offset, SeekOrigin origin)
{
long pos = -1;
switch(origin)
{
case SeekOrigin.Begin :
pos = offset;
break;
case SeekOrigin.Current :
pos = Position + offset;
break;
case SeekOrigin.End :
break;
}
// We generally disallow seeking of the stream
// However, in unmanaged code, many people use Seek(0,CURR) to retrieve // the current position
// Special case (that is, if Seek does not change position, do not
// throw an exception)
if (pos==Position)
{
return pos;
}
else
{
throw new NotSupportedException("ForwardOnlyEventingReadStream does not support Seek()");
}
}