0

私が最近遭遇した興味深い問題:

Streamクラス(カスタムストリーミングパイプラインコンポーネントのラッピングストリーム)を実装しましたが、その後のテストでパイプラインが例外をスローしました。例外は、ストリームが転送専用の書き込み不可能なストリーム実装であるため、 NotImplementedExceptionをスローするようにハードコーディングしたSeekの呼び出しからスローされました(CanSeekとCanWriteはfalseを返し、Position:setは例外をスローします。異常はありません)。Seekの呼び出しはアンマネージコードからのものだったので、あまりデバッグすることはできませんでした。私が本当に知ることができたのは、CanSeekがfalseを返し、ユーザーがCanSeekをチェックしていなくても、 Stream実装でSeekが呼び出されていたということだけでした。

どうしたの?

4

1 に答える 1

7

すべての答えはここで見つかりました:マネージドストリーミングパイプラインコンポーネントでのSeekメソッドの実装

当時、Positionプロパティがなかったことがわかりました。したがって、ストリームポインタの現在の位置を取得する方法は、Seek( 0, SeekOrigin.Current );

魅力的な。再び古い新しいもの。

そのページには、必要な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()");
   }
}

そしてそれが全体の解決策でした。わーい!

于 2012-06-16T03:31:51.097 に答える