public void ReleaseLock(BufferLock lck) { lock (buffer) { locks.Remove(lck); } }
public string ReadReceived() { BufferLock.WaitOne(); if (ReveivedBuffer != null) { var str = Encoding.Default.GetString(ReveivedBuffer); if (str[0] == 0x23 && str[str.Length - 1] == 0x0A) { ReveivedBuffer = null; // 清除原有接收数据 BufferLock.ReleaseMutex(); return(str.Substring(1, str.Length - 2)); } } BufferLock.ReleaseMutex(); return(null); }
private void UpdateBuffer(int offset, int count, BufferLock flags, Action <IntPtr, int> updater) { RestoreBuffer(); IntPtr buffer1, buffer2; int buffer1Size, buffer2Size; _buffer.Lock(offset, count, out buffer1, out buffer1Size, out buffer2, out buffer2Size, flags); try { if (buffer1 != IntPtr.Zero) { updater(buffer1, buffer1Size); } if (buffer2 != IntPtr.Zero) { updater(buffer2, buffer2Size); } } finally { _buffer.Unlock(buffer1, buffer1Size, buffer2, buffer2Size); } }
public BufferLock AcquireLock(int startIndex, int endIndex) { if (startIndex < 0) { throw new ArgumentOutOfRangeException("startIndex"); } if (startIndex > endIndex || endIndex >= buffer.Length) { throw new ArgumentOutOfRangeException("endIndex"); } lock (buffer) { foreach (var l in locks) { if (!(endIndex < l.StartIndex || startIndex > l.EndIndex)) { return(null); } } var bl = new BufferLock(startIndex, endIndex, this); locks.Add(bl); return(bl); } }