Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现自定义流_C#_Stream - Fatal编程技术网

C# 实现自定义流

C# 实现自定义流,c#,stream,C#,Stream,我正在调用写入流的dll。dll中方法的签名如下所示: public bool SomeMethod(Stream stream); 该方法基本上将二进制数据写入该流。因此,如果我将该方法称为: var file = System.IO.File.Create("SomeFile.txt"); /* call dll method */ SomeMethod(file); 然后我将基本上将输出写入该文件。在这个问题中,我将输出写入networkStream 无论如何,回到问题上来。我之所以

我正在调用写入流的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,那么我就不会尝试实现它


如果有人能给我展示一个如何实现抽象流类的抽象方法的基本示例,我将不胜感激

如果您只想在调用Read、Seek或类似方法时触发事件,请重写基类版本,直接调用它们,并在之前或之后引发相应的事件。如果您想获得有关编写流类的帮助,请查看.Net代码本身。但是,如果您想将流解析成更可读的东西,请考虑创建一个<代码> iQueDebug <代码>,它读取并处理流,而不是.< /p> 最简单的自定义流,一个“封装”其他流(类似于压缩流)的流。每个方法只需将其实现重定向到内部流

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;
 } 
///
}
用法示例:
采用流的函数(new MyStream(new MemoryStream());


真正的代码将需要在触发事件之前/之后处理inners流操作中的异常,并正确处理IDisposable。

如果基本方法是抽象的,我将如何调用它们?@TonoNam您从何处读取数据?如果您从文件中读取数据,请重写
FileStream
。如果您正在读取表单内存,请使用e a
MemoryStream
等等。如果您不确定,请从a
MemoryStream
开始。我调用的dll方法压缩一个流,并将输出放在不同的流中,因此它以两个流作为参数。我希望使用7z.dll,因为它对我计划发送的文件具有最高的压缩比。因此文件正在一个流上复制,输出正在写入另一个流。因为我想在网络上发送该输出,所以我使用了一个网络流。该流的问题是它不支持搜索。我知道我可以将文件压缩到磁盘,然后发送,但这不是很有效…我不熟悉7z.dll but您可以向库请求下一个N字节的数据(用于读取)或压缩下一个N字节的数据(用于写入)?是这样的,只需调用这些方法。否则,在页面中进行操作。我不会尝试将整个文件放入内存中。我需要通过网络发送的文件大小为4GB。我不想等待30分钟以等待压缩,然后再开始发送。此外,我更喜欢使用7zip,因为它对我不需要的文件具有更高的压缩比正在尝试发送。如果您阅读此问题,您可能会更好地理解我正在尝试做的事情。可能我没有清楚地解释我自己。无论如何,感谢您的帮助!您的ans帮了我很多忙!这种“包装器”是装饰设计模式的实现。