C# MemoryStream有一个线程写入,另一个线程读取
这就是我如何写入流,然后使用1个线程从中读取:C# MemoryStream有一个线程写入,另一个线程读取,c#,multithreading,stream,memorystream,C#,Multithreading,Stream,Memorystream,这就是我如何写入流,然后使用1个线程从中读取: System.IO.MemoryStream ms = new System.IO.MemoryStream(); // write to it ms.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 7); // go to the begining ms.Seek(0, System.IO.SeekOrigin.Begin
System.IO.MemoryStream ms = new System.IO.MemoryStream();
// write to it
ms.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 7);
// go to the begining
ms.Seek(0, System.IO.SeekOrigin.Begin);
// now read from it
byte[] myBuffer = new byte[7];
ms.Read(myBuffer, 0, 7);
现在我想知道是否可以从一个线程写入内存流,然后从另一个线程读取该流。由于流的状态已满,因此不能同时使用具有从两个线程查找功能的流。e、 g.NetworkStream有两个通道,一个用于读取,一个用于写入,因此不支持查找 如果需要查找功能,则需要创建两个流,一个用于读取,另一个用于写入。否则,您可以简单地创建一个新的流类型,通过独占访问底层流并恢复其写/读位置,允许从底层内存流进行读写。一个简单的例子是:
class ProducerConsumerStream : Stream
{
private readonly MemoryStream innerStream;
private long readPosition;
private long writePosition;
public ProducerConsumerStream()
{
innerStream = new MemoryStream();
}
public override bool CanRead { get { return true; } }
public override bool CanSeek { get { return false; } }
public override bool CanWrite { get { return true; } }
public override void Flush()
{
lock (innerStream)
{
innerStream.Flush();
}
}
public override long Length
{
get
{
lock (innerStream)
{
return innerStream.Length;
}
}
}
public override long Position
{
get { throw new NotSupportedException(); }
set { throw new NotSupportedException(); }
}
public override int Read(byte[] buffer, int offset, int count)
{
lock (innerStream)
{
innerStream.Position = readPosition;
int red = innerStream.Read(buffer, offset, count);
readPosition = innerStream.Position;
return red;
}
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
lock (innerStream)
{
innerStream.Position = writePosition;
innerStream.Write(buffer, offset, count);
writePosition = innerStream.Position;
}
}
}
看这个,是的,很多地方他们都在谈论它。如果我能看到一个非常基本的例子,说明我将如何做到这一点,我将不胜感激……非常感谢!我应该如何实现seek方法?我是否应该移动
innerStream.Position
?想想看。你想做什么?在读通道中寻道还是在写通道中寻道?或者两者都有?@Polity实现主题标题(“MemoryStream有一个线程写入,另一个线程读取”)需要什么,但要使用字符串而不是字节,并且不进行任何查找?当消费者超过生产者时会发生什么?我相信这会导致消费者过早地终止交易。@NickWhaley很好,这个实现没有考虑到这一点。当数据可用时,高阶生产者应向高阶消费者发出信号。请随意发布一个为您实现这一点的实现