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) { }
        }
示例#2
0
        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) { }
        }
示例#3
0
        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)
            {
                //エラー発生時はそのまま抜ける
            }
        }