15

ストリームに書き込むdllを呼び出しています。dll内のメソッドのシグネチャは次のようになります。

public bool SomeMethod(Stream stream);

そのメソッドは基本的にそのストリームにバイナリデータを書き込みます。したがって、そのメソッドを次のように呼び出す場合:

var file = System.IO.File.Create("SomeFile.txt");
/* call dll method */ SomeMethod(file); 

次に、基本的にそのファイルに出力を書き込みます。この質問では、出力をnetworkStreamに書き込んでいます。

とにかく、質問に戻ります。自分でストリームを作成したいのは、いつイベントが発生するのか知りたいからです。たとえば、独自のストリームクラスを作成する場所を次のようにするとします。

class MyStream : Stream
{
    private long Position;

    public override int Read(byte[] buffer, int offset, int count)
    {

            // implementation goes here

            /* HERE I COULD CALL A CUSTOM EVENT */
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        // SAME THING I WILL LIKE TO PERFORM AN ACTION IF THIS METHOD IS CALLED!
    }

    // etc implement rest of abstract methods....

そのストリームの出力をネットワークに書き込んでいるので、何らかのイベントが発生した場合は速度を落としたいと思うかもしれません。dllを制御できる場所があれば、これを実装しようとはしません。

抽象Streamクラスの抽象メソッドを実装する方法の非常に基本的な例を誰かに教えてもらえれば幸いです。

4

2 に答える 2

23

最も簡単なカスタムストリームは、他のストリームを「ラップ」するストリームです(圧縮ストリームと同様)。各メソッドは、その実装を内部ストリームにリダイレクトするだけです。

class MyStream : Stream
{
 Stream inner;
 public MyStream(Stream inner)
 {
  this.inner = inner;
 }

 public override int Read(byte[] buffer, int offset, int count) 
 { 
    var result = inner.Read(buffer, offset, count);

            /* HERE I COULD CALL A CUSTOM EVENT */ 
   return result;
 } 
///
}

使用例:functionThatTakesStream(new MyStream(new MemoryStream());

実際のコードは、イベントの発生前/発生後の内部ストリームの操作で例外を処理し、IDisposableを正しく処理する必要があります。

于 2012-09-08T06:41:26.043 に答える
1

Read、Seek、または同様のメソッドが呼び出されたときにイベントを発生させるだけの場合は、基本クラスのバージョンをオーバーライドし、それらを直接呼び出して、前後に適切なイベントを発生させます。ストリームクラスの作成についてサポートが必要な場合は、 http://referencesource.microsoft.com/netframework.aspxで入手できる.Netコード自体を参照してください。ただし、ストリームをより読みやすいものに解析する場合はIEnumerable<MyClass>、代わりに、ストリームを読み込んで処理するを作成することを検討してください。

于 2012-09-08T06:40:23.283 に答える