Beispiel #1
0
        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
                              );
        }
Beispiel #2
0
        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
                              );
        }
Beispiel #3
0
        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);
        }