public async void ReadThread() { try { while (true) { while (receiverAccessor.ReadByte(0) != 1) { if (readCts.Token.IsCancellationRequested) { return; } Thread.Sleep(1);// await Task.Delay(1); } System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread DataReceived"); long position = 1; //CommandType var length = receiverAccessor.ReadInt32(position); position += sizeof(int); var typeNameArray = new byte[length]; receiverAccessor.ReadArray(position, typeNameArray, 0, typeNameArray.Length); position += typeNameArray.Length; System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread GetCommandType"); //RequestID length = receiverAccessor.ReadInt32(position); position += sizeof(int); var requestIdArray = new byte[length]; receiverAccessor.ReadArray(position, requestIdArray, 0, requestIdArray.Length); position += requestIdArray.Length; System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread GetRequestID"); //Data length = receiverAccessor.ReadInt32(position); position += sizeof(int); var dataArray = new byte[length]; receiverAccessor.ReadArray(position, dataArray, 0, dataArray.Length); System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread GetData"); //Write finish flag receiverAccessor.Write(0, (byte)0); System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread Write finish flag"); var commandType = PipeCommands.GetCommandType(Encoding.UTF8.GetString(typeNameArray)); var requestId = Encoding.UTF8.GetString(requestIdArray); var data = BinarySerializer.Deserialize(dataArray, commandType); System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread Parsed Type:{commandType.Name} requestId = {requestId}"); if (WaitReceivedDictionary.ContainsKey(requestId)) { System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread ContainsKey"); WaitReceivedDictionary[requestId] = data; } else { System.Diagnostics.Debug.WriteLine($"MemoryMappedFileBase ReadThread Raise Event"); ReceivedEvent?.Invoke(this, new DataReceivedEventArgs(commandType, requestId, data)); } } } catch (NullReferenceException) { } }
public void ReadThread() { try { while (true) { while (receiverAccessor != null && receiverAccessor.ReadByte(0) != 1) { if (readCts.Token.IsCancellationRequested) { return; } Thread.Sleep(1); // await Task.Delay(1); } if (receiverAccessor == null) { return; } long position = 1; //CommandType var length = receiverAccessor.ReadInt32(position); position += sizeof(int); var typeNameArray = new byte[length]; receiverAccessor.ReadArray(position, typeNameArray, 0, typeNameArray.Length); position += typeNameArray.Length; //RequestID length = receiverAccessor.ReadInt32(position); position += sizeof(int); var requestIdArray = new byte[length]; receiverAccessor.ReadArray(position, requestIdArray, 0, requestIdArray.Length); position += requestIdArray.Length; //Data length = receiverAccessor.ReadInt32(position); position += sizeof(int); var dataArray = new byte[length]; receiverAccessor.ReadArray(position, dataArray, 0, dataArray.Length); //Write finish flag receiverAccessor.Write(0, (byte)0); var commandType = PipeCommands.GetCommandType(Encoding.UTF8.GetString(typeNameArray)); var requestId = Encoding.UTF8.GetString(requestIdArray); var data = BinarySerializer.Deserialize(dataArray, commandType); if (WaitReceivedDictionary.ContainsKey(requestId)) { WaitReceivedDictionary[requestId] = data; } else { ReceivedEvent?.Invoke(this, new DataReceivedEventArgs(commandType, requestId, data)); } } } catch (NullReferenceException) { } }