Пример #1
0
        public Task <bool> TryWriteSafeAsync(T item)
        {
            lock (_sync)
            {
                if (TryWriteSafe(item))
                {
                    return(TaskConstants.True);
                }

                if (_writeCompletion.Task.IsCompleted)
                {
                    return(TaskConstants.False);
                }

                var queuedWrite = new QueuedWrite(item);
                _writeQueue.Enqueue(queuedWrite);
                _balance++;
                OnBalanceChanged();
                return(queuedWrite.Task);
            }
        }
Пример #2
0
 private void PushWrite(ref QueuedWrite write)
 {
     if (writeQueue == null) {
         writeQueue = new QueuedWrite[16];
         writeCount = 0;
     } else if (writeQueue.Length == writeCount) {
         var queuedWriteArray = new QueuedWrite[writeQueue.Length*2];
         System.Array.Copy(writeQueue, 0, queuedWriteArray, 0, writeQueue.Length);
         for (var index = 0; index < writeQueue.Length; ++index) {
             writeQueue[index] = new QueuedWrite();
         }
         writeQueue = queuedWriteArray;
     }
     if (writeCount != 0)
         writeQueue[writeCount - 1] = currentWrite;
     writeQueue[writeCount++] = write;
     currentWrite = write;
 }
Пример #3
0
 private void FlushWriteQueue()
 {
     if (writeCount != 0)
         writeQueue[writeCount - 1] = currentWrite;
     for (var index = 0; index < writeCount; ++index) {
         data.Write(writeQueue[index].Data, writeQueue[index].Offset, writeQueue[index].Count);
         writeQueue[index] = new QueuedWrite();
     }
     writeCount = 0;
 }
Пример #4
0
 internal void QueueWrite(byte[] data, int offset, int count)
 {
     bytesWritten += count;
     lineTermination = MimeCommon.AdvanceLineTerminationState(lineTermination, data, offset, count);
     if ((writeCount == 1 ? currentWrite.Length - currentWrite.Count : (writeCount == 0 ? QueuedWrite.QueuedWriteSize : 0)) >= count) {
         if (writeCount == 0) {
             var write = new QueuedWrite();
             this.PushWrite(ref write);
         }
         currentWrite.Append(data, offset, count);
     } else {
         var write = new QueuedWrite();
         if (count < QueuedWrite.QueuedWriteSize && writeCount > 0)
             write = currentWrite;
         this.FlushWriteQueue();
         if (count < QueuedWrite.QueuedWriteSize && write.Length > 0) {
             write.Reset();
             write.Append(data, offset, count);
             this.PushWrite(ref write);
         } else
             this.data.Write(data, offset, count);
     }
 }