/// <summary> /// Read from the queue into the consumer callable. /// /// <paramref name="consumer"/> is expected to return the number of bytes /// consumed, sans the header. /// </summary> /// <param name="consumer"></param> public int Read(Func <string, InteropMessageHeader, IntPtr, int> consumer) { return(messageConsumer.Read((ptr) => { int bytesRead = 0; // Read target name (varying length string) int targetSize = FastStructure.PtrToStructure <int>(ptr + bytesRead); bytesRead += FastStructure.SizeOf <int>(); string targetName = ""; if (targetSize > 0) { byte[] target = new byte[targetSize]; FastStructure.ReadBytes(target, ptr + bytesRead, 0, targetSize); targetName = Encoding.UTF8.GetString(target); bytesRead += targetSize; } // Read message header var headerSize = FastStructure.SizeOf <InteropMessageHeader>(); var header = FastStructure.PtrToStructure <InteropMessageHeader>(ptr + bytesRead); bytesRead += headerSize; // Call consumer to handle the rest of the payload bytesRead += consumer(targetName, header, ptr + bytesRead); // InteropLogger.Debug($"Consume {bytesRead} bytes - {header.type} for `{targetName}`"); return bytesRead; }, 0)); }