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) { } }
protected async Task RunningAsync() { IsConnected = true; bool isCommandName = true; Type commandType = null; string requestId = null; try { //受信 while (IsConnected) { if (isCommandName) {//1つ目の通信はコマンドの種別とID isCommandName = false; var items = (await ReadString(namedPipeReceiveStream)).Split('|'); commandType = PipeCommands.GetCommandType(items[0]); requestId = items[1]; } else {//2つ目の通信はコマンドの中身のバイナリ isCommandName = true; var lengthBytes = new byte[4]; await namedPipeReceiveStream.ReadAsync(lengthBytes, 0, 4); var length = BitConverter.ToInt32(lengthBytes, 0); var dataBytes = new byte[length]; await namedPipeReceiveStream.ReadAsync(dataBytes, 0, length); var data = BinarySerializer.Deserialize(dataBytes, commandType); if (WaitReceivedDictionary.ContainsKey(requestId)) { WaitReceivedDictionary[requestId] = data; } else { ReceivedEvent?.Invoke(this, new DataReceivedEventArgs(commandType, requestId, data)); } } } } catch (Exception) { //エラー発生時はそのまま抜ける } }