public override void Write(byte[] buffer, int offset, int count) { if (count <= 0 || offset < 0 || buffer.Length <= 1 || offset > buffer.Length) { return; } try { ByteBufferLock.WaitOne(); int size = ByteBuffer.Count; byte[] subBuffer = buffer.Skip(offset).Take(count).ToArray(); ByteBuffer.AddRange(subBuffer); byte[] cloneBuffer = ByteBuffer.Skip(size).ToArray(); bool equal = subBuffer.Length == cloneBuffer.Length; if (equal) { for (int i = 0; i < subBuffer.Length; i++) { equal = subBuffer[i] == cloneBuffer[i]; if (!equal) { break; } } } string sub = Encoding.ASCII.GetString(subBuffer); string clone = Encoding.ASCII.GetString(cloneBuffer); //ByteBuffer.AddRange(buffer, offset, count); InternalWritePointer += count; //try { // OverReadLock.Release(); //} catch { } } finally { ByteBufferLock.Release(); } foreach (Stream x in ParallelWriteStreams) { x.Write(buffer, offset, count); } }
//public override void CopyTo(Stream destination, int bufferSize) { // while(InternalWritePointer < Document.Length) { // if(ByteBuffer.Count <= 0) { // OverReadLock.WaitOne(0);//ensure locked // OverReadLock.WaitOne(); // } // try { // ByteBufferLock.WaitOne(); // destination.Write(ByteBuffer.InternalArray, 0, ByteBuffer.Count); // ByteBuffer.Clear(); // }finally{ // ByteBufferLock.Release(); // } // } //} //public override async Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) { // byte[] buffer = new byte[bufferSize]; // while(InternalWritePointer < Document.Length || ByteBuffer.Count > 0) { // //if(ByteBuffer.Count <= 0 && InternalWritePointer < Document.Length) { // // OverReadLock.WaitOne(0);//ensure locked // // OverReadLock.WaitOne(); // //} // try { // ByteBufferLock.WaitOne(); // int copy = buffer.Length > ByteBuffer.Count ? ByteBuffer.Count : buffer.Length; // for(int i = 0; i < copy; i++){ // buffer[i] = ByteBuffer[i]; // } // ByteBuffer.RemoveRange(0, copy); // await destination.WriteAsync(buffer, 0, copy); // //await destination.WriteAsync(ByteBuffer.ToArray(), 0, ByteBuffer.Count); // //await destination.WriteAsync(ByteBuffer.InternalArray, 0, ByteBuffer.Count); // ByteBuffer.Clear(); // } finally { // ByteBufferLock.Release(); // } // } //} public override int Read(byte[] buffer, int offset, int count) { //if(ByteBuffer.Count <= 0 && InternalWritePointer < Document.Length) { // OverReadLock.WaitOne(0);//ensure locked // OverReadLock.WaitOne(); //} try { ByteBufferLock.WaitOne(); if (count > ByteBuffer.Count) { count = ByteBuffer.Count; } for (int i = 0; i < count; i++) { buffer[i + offset] = ByteBuffer[i]; } ByteBuffer.RemoveRange(0, count); return(count); } finally { ByteBufferLock.Release(); } }