Esempio n. 1
0
        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());
            }
        }
Esempio n. 2
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);
            }
        }