예제 #1
0
        public Task <IResponse> Call(IRequest request)
        {
            TaskCompletionSource <IResponse> tcs = new TaskCompletionSource <IResponse>();
            ActorTask task = new ActorTask(request, tcs);

            this.Add(task);
            return(task.tcs.Task);
        }
예제 #2
0
        private void Add(ActorTask task)
        {
            if (IsDisposed)
            {
                throw new Exception("GateSessionActorId Disposed! dont hold actorproxy");
            }

            WaitingMessages.Enqueue(task);

            AllowGet();
        }
예제 #3
0
        private void AllowGet()
        {
            if (this.Tcs == null || this.WaitingMessages.Count <= 0)
            {
                return;
            }

            ActorTask task = WaitingMessages.Peek();
            var       t    = this.Tcs;

            this.Tcs = null;
            t?.SetResult(task);
        }
예제 #4
0
        public async void UpdateAsync()
        {
            try
            {
                while (true)
                {
                    ActorTask task = await GetAsync();

                    if (this.IsDisposed)
                    {
                        return;
                    }

                    await RunTask(task);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }
예제 #5
0
        private async Task RunTask(ActorTask task)
        {
            Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(this.Address);

            task.message.ActorId = this.ActorId;
            IResponse response = await session.Call(task.message);

            switch (response.Error)
            {
            case ErrorCode.ERR_Success:
            {
                this.WaitingMessages.Dequeue();
                task.tcs?.SetResult(response);
            }
            break;

            default:
            {
                this.Error = response.Error;
                Game.Scene.GetComponent <ActorMessageSenderComponent>().Remove(ActorId);
            }
            break;
            }
        }
예제 #6
0
        public void Send(IRequest request)
        {
            ActorTask task = new ActorTask(request);

            this.Add(task);
        }