コード例 #1
0
 protected byte[] Bread(int length)
 {
     ThrowIfEnded();
     byte[] data;
     if (Buffered < length)
     {
         BwaitIndex = BreadIndex + length;
         Bwait.WaitOne();
         if (Ended)
         {
             return(null);
         }
         Bwait.Reset();
         BwaitIndex = -1;
     }
     lock (BreadLock)
     {
         data = new byte[length];
         lock (BwriteLock)
         {
             Bstream.Position = BreadIndex;
             Bstream.Read(data, 0, length);
             BreadIndex += length;
         }
     }
     Btrim();
     return(data);
 }
コード例 #2
0
 protected void Bwrite(byte[] data)
 {
     ThrowIfEnded();
     lock (BwriteLock)
     {
         Bstream.Position = BwriteIndex;
         Bstream.Write(data, 0, data.Length);
         BwriteIndex += data.Length;
         if (BreadIndex != -1 && BwriteIndex >= BreadIndex)
         {
             Bwait.Set();
         }
     }
 }
コード例 #3
0
 virtual public void End()
 {
     ThrowIfEnded();
     lock (BreadLock)
     {
         lock (BwriteLock)
         {
             Ended = true;
             Bstream.Dispose();
             Bblock.Set();
             Bwait.Set();
             Bblock.Dispose();
             Bwait.Dispose();
             PipedTo = null;
             Paused  = false;
         }
     }
 }