Beispiel #1
0
        private async Task <DMessage> DoRequest(params dynamic[] values)
        {
            DMessage message = new DMessage(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);
                }
            }));
        }
Beispiel #2
0
        private void ProcessMessages()
        {
            while (true)
            {
                DMessage message = DMessage.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 == DValueTag.NFY)
                {
                    switch ((Notify)(int)message[1])
                    {
                    case Notify.Status:
                        FileName   = (string)message[3];
                        LineNumber = (int)message[5];
                        Running    = (int)message[2] == 0;
                        Status?.Invoke(this, EventArgs.Empty);
                        break;

                    case Notify.Throw:
                        Throw?.Invoke(this, new ThrowEventArgs(
                                          (string)message[3], (string)message[4], (int)message[5],
                                          (int)message[2] != 0));
                        break;

                    case Notify.Detaching:
                        tcp.Close();
                        Detached?.Invoke(this, EventArgs.Empty);
                        return;

                    case Notify.AppNotify:
                        switch ((AppNotify)(int)message[2])
                        {
                        case AppNotify.DebugPrint:
                            PrintType type      = (PrintType)(int)message[3];
                            string    debugText = (string)message[4];
                            string    prefix    = type == PrintType.Assert ? "ASSERT"
                                        : type == PrintType.Debug ? "debug"
                                        : type == PrintType.Error ? "ERROR"
                                        : type == PrintType.Info ? "info"
                                        : type == PrintType.Trace ? "trace"
                                        : type == PrintType.Warn ? "warn"
                                        : "log";
                            Print?.Invoke(this, new TraceEventArgs(string.Format("{0}: {1}", prefix, debugText)));
                            break;
                        }
                        break;
                    }
                }
                else if (message[0].Tag == DValueTag.REP || message[0].Tag == DValueTag.ERR)
                {
                    lock (replyLock) {
                        DMessage request = requests.Dequeue();
                        replies.Add(request, message);
                    }
                }
            }
        }