Ton*_*Nam 17 c# multithreading memorystream stream
这是我写入流然后使用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);
// now read from it
byte[] myBuffer = new byte[7];
ms.Read(myBuffer, 0, 7);
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否可以从一个线程写入内存流并从单独的线程中读取该流.
Pol*_*ity 15
由于Stream状态已满,因此无法同时使用Stream同时从2个线程中搜索功能.例如,NetworkStream有2个通道,一个用于读取,一个用于写入,因此不支持搜索.
如果您需要寻找功能,则需要创建2个流,一个用于读取,一个用于写入.此外,您可以简单地创建一个新的Stream类型,它允许通过对底层流的独占访问并恢复其写/读位置,从底层内存流中读取和写入.一个原始的例子是:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)