public void OnReply(RpcBroker.Message message) { Log.Trace("RpcClient.OnReply"); if (message == null) { throw new ArgumentNullException("message"); } if (this.Replies.TryAdd(message.Token, message) == false) { throw new InvalidOperationException("A reply to this message has already been dispatched"); } }
public JSValue Invoke(String procedure, Object[] arguments, Int32 timeoutMsec = 5000) { Log.Trace("RpcClient.Invoke( procedure: {0} )", procedure); if (String.IsNullOrWhiteSpace(procedure)) { throw new ArgumentException("procedure"); } if (arguments == null) { throw new ArgumentNullException("arguments"); } var request = new RpcBroker.Message { Procedure = procedure, Data = new JSValue(arguments), }; this.SendRequest(request); // spin until a reply has been received or timeout RpcBroker.Message reply; var spinCount = 0; while (this.Replies.TryGetValue(request.Token, out reply) == false) { if (spinCount > (timeoutMsec / 10)) { break; } Thread.Sleep(10); spinCount++; } if (reply == null) { throw new TimeoutException("A remote invocation has timed out before receiving a reply"); } return(reply.Data); }
public void OnRequest(RpcBroker.Message message) { Log.Trace("RpcServer.OnRequest"); if (message == null) { throw new ArgumentNullException("message"); } if (this.RequestHandler == null) { return; } var replyData = this.RequestHandler(message.Data.Value as Object[]); var reply = new RpcBroker.Message(message.Token) { Procedure = message.Procedure, Data = replyData, }; this.SendReply(reply); }