private async void RunTask(ActorTask task)
        {
            try
            {
                IResponse response = await task.Run();

                // 如果没找到Actor,发送窗口减少为1,重试
                if (response.Error == ErrorCode.ERR_NotFoundActor)
                {
                    this.CancellationTokenSource.Cancel();
                    this.WindowSize = 1;
                    ++this.failTimes;

                    while (this.WaitingTasks.Count > 0)
                    {
                        ActorTask actorTask = this.WaitingTasks.Dequeue();
                        this.RunningTasks.Enqueue(actorTask);
                    }
                    ObjectHelper.Swap(ref this.RunningTasks, ref this.WaitingTasks);

                    // 失败3次则清空actor发送队列,返回失败
                    if (this.failTimes > 3)
                    {
                        while (this.WaitingTasks.Count > 0)
                        {
                            ActorTask actorTask = this.WaitingTasks.Dequeue();
                            actorTask.RunFail(response.Error);
                        }

                        // 失败直接删除actorproxy
                        Game.Scene.GetComponent <ActorProxyComponent>().Remove(this.Id);
                        return;
                    }
                    // 等待一会再发送
                    await Game.Scene.GetComponent <TimerComponent>().WaitAsync(this.failTimes * 500);

                    int appId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(this.Id);

                    this.Address = Game.Scene.GetComponent <StartConfigComponent>().Get(appId).GetComponent <InnerConfig>().IPEndPoint;
                    this.CancellationTokenSource = new CancellationTokenSource();
                    this.AllowGet();
                    return;
                }

                // 发送成功
                this.LastSendTime = TimeHelper.Now();
                this.failTimes    = 0;
                if (this.WindowSize < MaxWindowSize)
                {
                    ++this.WindowSize;
                }

                this.RunningTasks.Dequeue();
                this.AllowGet();
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }
        }
        public void Send(IMessage message)
        {
            ActorTask task = new ActorTask();

            task.message = message;
            task.proxy   = this;
            this.Add(task);
        }
Example #3
0
        public void Send(IActorMessage message)
        {
            ActorTask task = new ActorTask
            {
                message = message,
                proxy   = this
            };

            this.Add(task);
        }
        public Task <IResponse> Call(IRequest request)
        {
            ActorTask task = new ActorTask();

            task.message = request;
            task.proxy   = this;
            task.Tcs     = new TaskCompletionSource <IResponse>();
            this.Add(task);
            return(task.Tcs.Task);
        }
Example #5
0
        private Task <ActorTask> GetAsync()
        {
            if (this.WaitingTasks.Count > 0)
            {
                ActorTask task = this.WaitingTasks.Peek();
                return(Task.FromResult(task));
            }

            this.tcs = new TaskCompletionSource <ActorTask>();
            return(this.tcs.Task);
        }
Example #6
0
        public Task <IResponse> Call(IActorRequest request)
        {
            ActorTask task = new ActorTask
            {
                message = request,
                proxy   = this,
                Tcs     = new TaskCompletionSource <IResponse>()
            };

            this.Add(task);
            return(task.Tcs.Task);
        }
Example #7
0
        private void AllowGet()
        {
            if (this.tcs == null || this.WaitingTasks.Count <= 0)
            {
                return;
            }
            ActorTask task = this.WaitingTasks.Peek();

            var t = this.tcs;

            this.tcs = null;
            t.SetResult(task);
        }
Example #8
0
 private void Add(ActorTask task)
 {
     if (this.IsDisposed)
     {
         throw new Exception("ActorProxy Disposed! dont hold actorproxy");
     }
     this.WaitingTasks.Enqueue(task);
     // failtimes > 0表示正在重试,这时候不能加到正在发送队列
     if (this.failTimes == 0)
     {
         this.AllowGet();
     }
 }
        private void AllowGet()
        {
            if (this.tcs == null || this.WaitingTasks.Count <= 0 || this.RunningTasks.Count >= this.WindowSize)
            {
                return;
            }

            ActorTask task = this.WaitingTasks.Dequeue();

            this.RunningTasks.Enqueue(task);

            var t = this.tcs;

            this.tcs = null;
            t.SetResult(task);
        }
Example #10
0
        private async Task RunTask(ActorTask task)
        {
            try
            {
                IResponse response = await task.Run();

                // 如果没找到Actor,重试
                if (response.Error == ErrorCode.ERR_NotFoundActor)
                {
                    this.CancellationTokenSource.Cancel();
                    ++this.failTimes;

                    // 失败10次则清空actor发送队列,返回失败
                    if (this.failTimes > 10)
                    {
                        // 失败直接删除actorproxy
                        Log.Info($"actor send message fail, actorid: {this.Id}");
                        Game.Scene.GetComponent <ActorProxyComponent>().Remove(this.Id);
                        return;
                    }
                    // 等待1s再发送
                    await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);

                    int appId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(this.Id);

                    this.Address = Game.Scene.GetComponent <StartConfigComponent>().Get(appId).GetComponent <InnerConfig>().IPEndPoint;
                    this.CancellationTokenSource = new CancellationTokenSource();
                    this.AllowGet();
                    return;
                }

                // 发送成功
                this.LastSendTime = TimeHelper.Now();
                this.failTimes    = 0;

                this.WaitingTasks.Dequeue();
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Example #11
0
        public async void UpdateAsync()
        {
            while (true)
            {
                ActorTask actorTask = await this.GetAsync();

                if (this.IsDisposed)
                {
                    return;
                }
                try
                {
                    await this.RunTask(actorTask);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                    return;
                }
            }
        }
Example #12
0
        public override void Dispose()
        {
            if (this.IsDisposed)
            {
                return;
            }

            base.Dispose();
            this.LastSendTime = 0;
            this.Address      = null;

            while (this.WaitingTasks.Count > 0)
            {
                ActorTask actorTask = this.WaitingTasks.Dequeue();
                actorTask.RunFail(ErrorCode.ERR_NotFoundActor);
            }

            this.failTimes = 0;
            var t = this.tcs;

            this.tcs = null;
            t?.SetResult(new ActorTask());
        }