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); } } } }
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); } })); }