コード例 #1
0
        private void ProcessMessages()
        {
            while (true)
            {
                KiMessage message = KiMessage.Receive(tcp.Client);
                if (message == null)
                {
                    // if DMessage.Receive() returns null, detach.
                    tcp.Close();
                    Detached?.Invoke(this, EventArgs.Empty);
                    return;
                }
                else if (message[0].Tag == KiTag.NFY)
                {
                    switch ((KiNotify)(int)message[1])
                    {
                    case KiNotify.Detach:
                        tcp.Close();
                        Detached?.Invoke(this, EventArgs.Empty);
                        return;

                    case KiNotify.Log:
                        LogOp  type      = (LogOp)(int)message[2];
                        string debugText = (string)message[3];
                        string prefix    = type == LogOp.Trace ? "trace"
                                : "log";
                        Print?.Invoke(this, new TraceEventArgs(string.Format("{0}: {1}", prefix, debugText)));
                        break;

                    case KiNotify.Pause:
                        FileName   = (string)message[2];
                        LineNumber = (int)message[4];
                        Running    = false;
                        Status?.Invoke(this, EventArgs.Empty);
                        break;

                    case KiNotify.Resume:
                        Running = true;
                        Status?.Invoke(this, EventArgs.Empty);
                        break;

                    case KiNotify.Throw:
                        Throw?.Invoke(this, new ThrowEventArgs(
                                          (string)message[3], (string)message[4], (int)message[5],
                                          (int)message[2] != 0));
                        break;
                    }
                }
                else if (message[0].Tag == KiTag.REP || message[0].Tag == KiTag.ERR)
                {
                    lock (replyLock) {
                        KiMessage request = requests.Dequeue();
                        replies.Add(request, message);
                    }
                }
            }
        }
コード例 #2
0
        private async Task <KiMessage> DoRequest(params dynamic[] values)
        {
            KiMessage message = new KiMessage(values);

            lock (replyLock)
                requests.Enqueue(message);
            message.Send(tcp.Client);

            return(await Task.Run(() =>
            {
                while (true)
                {
                    lock (replyLock) {
                        if (replies.ContainsKey(message))
                        {
                            var reply = replies[message];
                            replies.Remove(message);
                            return reply;
                        }
                    }
                    Thread.Sleep(1);
                }
            }));
        }