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