Exemplo n.º 1
0
        public Task <string> ReceiveQuery(ReceivedQuery query)
        {
            var item = new QueryQueueItem(query);

            _receivedQueries.Enqueue(item);
            return(item.ResultSource.Task);
        }
Exemplo n.º 2
0
        private void OnReceivedQuery(object?sender, ReceiveQueryEventArgs e)
        {
            string content = e.Query.Query;
            int    i       = FindColonCharIndex(content);
            string command = (i == -1) ? content : content.Substring(0, i);
            string args    = (i == -1) ? "" : content.Substring(i + 1);

            var ea = new QueryReceivedEventArgs(command, args);

            App.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                ReceivedQuery?.Invoke(this, ea);
                e.Query.Reply(string.IsNullOrWhiteSpace(ea.Result) ? "" : ea.Result);
            }));
        }
        private void ReadMessage()
        {
            string message = "";
            bool   isReply = false;
            int    id      = 0;

            lock (_receiverLock)
            {
                if (_receiverAccessor == null)
                {
                    return;
                }

                short messageType = _receiverAccessor.ReadInt16(2);
                isReply = messageType > 0;
                id      = _receiverAccessor.ReadInt32(4);
                int bodyLength = _receiverAccessor.ReadInt32(8);

                _receiverAccessor.ReadArray(12, _readBuffer, 0, bodyLength);
                message = Encoding.UTF8.GetString(_readBuffer, 0, bodyLength);
                _receiverAccessor.Write(0, (byte)0);
            }


            //3パターンある
            // - こちらが投げたQueryの返答が戻ってきた
            // - Commandを受け取った
            // - Queryを受け取った
            if (isReply)
            {
                if (_sendedQueries.TryRemove(id, out var src))
                {
                    //戻ってきた結果によってTaskが完了となる
                    src.SetResult(message);
                }
            }
            else if (id == 0)
            {
                ReceiveCommand?.Invoke(this, new ReceiveCommandEventArgs(message));
            }
            else
            {
                var query = new ReceivedQuery(message, id, this);
                ReceiveQuery?.Invoke(this, new ReceiveQueryEventArgs(query));
            }
        }
Exemplo n.º 4
0
 public QueryQueueItem(ReceivedQuery query)
 {
     Query = query;
 }