protected override void ExecuteJsonCommand(JsonWebSocketSession session, Data.RequestAdd commandInfo) { log4j.Info("RequestAdd: " + Newtonsoft.Json.JsonConvert.SerializeObject(commandInfo)); //session.Send("ResponseAdd " + requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString()); //////to test timeOut on client site. int delay = random.Next(1, 10); delay *= 1000; log4j.Info("delay: " + delay); Task task = Task.Factory.StartNew(() => { ////to test timeOut on client site. Task.Delay(delay).Wait(); Data.ResponseAdd responseAdd = new Data.ResponseAdd { UUID = commandInfo.UUID }; responseAdd.Result = commandInfo.Param.Sum(); session.SendJsonMessage(Data.Cmd.TcsCommand.ResponseAdd.ToString(), responseAdd); }); // handle exception throw in task // https://stackoverflow.com/questions/8714235/handling-exception-with-tpl-without-wait/ task.ContinueWith((t) => { var ex = t.Exception; log4j.Info("error in task", ex); }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Current ); }
public override void ExecuteCommand(StringSession session, StringRequestInfo requestInfo) { log4j.Info("RequestAdd: " + requestInfo.Body); //session.Send("ResponseAdd " + requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString()); //////to test timeOut on client site. int delay = random.Next(1, 15); delay *= 1000; log4j.Info("delay: " + delay); // 20171004 // if code is sync and is blocking, server is processing the request 1 by 1 // since we r making our client calling having timeOut, if 1 call is blocking, all the following call will be timeOut. //Task.Delay(delay).Wait(); //Data.RequestAdd requestAdd = Newtonsoft.Json.JsonConvert.DeserializeObject<Data.RequestAdd>(requestInfo.Body); //Data.ResponseAdd responseAdd = new Data.ResponseAdd { UUID = requestAdd.UUID }; //responseAdd.Result = requestAdd.Param.Sum(); //session.Send("ResponseAdd " + Newtonsoft.Json.JsonConvert.SerializeObject(responseAdd)); // end 20171004 // change to let the server process in Task! Task task = Task.Factory.StartNew(() => { ////to test timeOut on client site. Task.Delay(delay).Wait(); Data.RequestAdd requestAdd = Newtonsoft.Json.JsonConvert.DeserializeObject <Data.RequestAdd>(requestInfo.Body); Data.ResponseAdd responseAdd = new Data.ResponseAdd { UUID = requestAdd.UUID }; responseAdd.Result = requestAdd.Param.Sum(); //session.Send("ResponseAdd " + Newtonsoft.Json.JsonConvert.SerializeObject(responseAdd)); session.Send(Data.Cmd.TcsCommand.ResponseAdd.ToString() + " " + Newtonsoft.Json.JsonConvert.SerializeObject(responseAdd)); //throw new Exception("wa haha!"); }); // handle exception throw in task // https://stackoverflow.com/questions/8714235/handling-exception-with-tpl-without-wait/ task.ContinueWith((t) => { var ex = t.Exception; log4j.Info("error in task", ex); }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Current ); }
public Data.ResponseAdd RequestAdd(params int[] param) { Data.RequestAdd requestAdd = new Data.RequestAdd { UUID = Guid.NewGuid().ToString() }; foreach (int p in param) { requestAdd.Param.Add(p); } // set a timeout on this call to server! // if we do not hv this timeout, calling this RequestAdd method will forever waiting if server never response! TaskCompletionSource <Data.ResponseAdd> tcs = new TaskCompletionSource <Data.ResponseAdd>(); const int timeOuts = 10000; //miliseconds CancellationTokenSource ct = new CancellationTokenSource(timeOuts); ResponseAddHandler rah = ((rpAdd) => { // only want the response UUID which is same as what we send if (rpAdd.UUID == requestAdd.UUID) { tcs.TrySetResult(rpAdd); } }); // when timeout occur, set Exception to TaskCompletionSource // also remove the callback from eventhandler ct.Token.Register(() => { OnResponseAdd -= rah; tcs.TrySetException(new TimeoutException("TimeOut " + timeOuts)); }, useSynchronizationContext: false); OnResponseAdd += rah; //hook to the eventHandler //string sendCmd = "RequestAdd " + Newtonsoft.Json.JsonConvert.SerializeObject(requestAdd) + "\r\n"; string sendCmd = Data.Cmd.MyCommand.RequestAdd.ToString() + " " + Newtonsoft.Json.JsonConvert.SerializeObject(requestAdd) + "\r\n"; base.Send(Encoding.UTF8.GetBytes(sendCmd)); tcs.Task.Wait(); Data.ResponseAdd responseAdd = tcs.Task.Result; OnResponseAdd -= rah; //after received our response, unhook it. we only expecting 1 response. return(responseAdd); }
public WebSocket.Data.ResponseAdd RequestAdd(int timeOutMilliSec, params int[] param) { Data.RequestAdd requestAdd = new Data.RequestAdd { UUID = Guid.NewGuid().ToString() }; foreach (int p in param) { requestAdd.Param.Add(p); } // set a timeout on this call to server! // if we do not hv this timeout, calling this RequestAdd method will forever waiting if server never response! TaskCompletionSource <Data.ResponseAdd> tcs = new TaskCompletionSource <Data.ResponseAdd>(); CancellationTokenSource ct = new CancellationTokenSource(timeOutMilliSec); ResponseAddHandler rah = ((rpAdd) => { // only want the response UUID which is same as what we send if (rpAdd.UUID == requestAdd.UUID) { tcs.TrySetResult(rpAdd); } }); // when timeout occur, set Exception to TaskCompletionSource // also remove the callback from eventhandler ct.Token.Register(() => { OnResponseAdd -= rah; tcs.TrySetException(new TimeoutException("TimeOut " + timeOutMilliSec)); }, useSynchronizationContext: false); OnResponseAdd += rah; //hook to the eventHandler Send(WebSocket.Data.Cmd.TcsCommand.RequestAdd.ToString(), requestAdd); tcs.Task.Wait(); WebSocket.Data.ResponseAdd responseAdd = tcs.Task.Result; OnResponseAdd -= rah; //after received our response, unhook it. we only expecting 1 response. return(responseAdd); }