Skip to content

Commit 9cc765e

Browse files
committed
[增加] 增加同时请求创建对象的时候的重复激活问题
#44
1 parent 6b93976 commit 9cc765e

4 files changed

Lines changed: 129 additions & 23 deletions

File tree

GameFrameX.Core/Abstractions/Agent/IComponentAgent.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public interface IComponentAgent : IWorker
4545
/// <remarks>
4646
/// 在组件开始激活流程前执行,可以用于进行一些预处理操作
4747
/// </remarks>
48-
Task BeforeActivation();
48+
Task<bool> BeforeActivation();
4949

5050
/// <summary>
5151
/// 激活组件代理
5252
/// <remarks>
5353
/// 用于初始化并启用组件代理的功能
5454
/// </remarks>
5555
/// </summary>
56-
Task Active();
56+
Task<bool> Active();
5757

5858
/// <summary>
5959
/// 组件激活后的回调方法
@@ -62,7 +62,7 @@ public interface IComponentAgent : IWorker
6262
/// <remarks>
6363
/// 在组件完成激活流程后执行,可以用于处理一些初始化后的逻辑
6464
/// </remarks>
65-
Task AfterActivation();
65+
Task<bool> AfterActivation();
6666

6767
/// <summary>
6868
/// 组件反激活前的回调方法
@@ -71,7 +71,7 @@ public interface IComponentAgent : IWorker
7171
/// <remarks>
7272
/// 在组件开始反激活流程前执行,可以用于保存状态或清理资源
7373
/// </remarks>
74-
Task BeforeInActivation();
74+
Task<bool> BeforeInActivation();
7575

7676
/// <summary>
7777
/// 反激活组件代理
@@ -89,7 +89,7 @@ public interface IComponentAgent : IWorker
8989
/// <remarks>
9090
/// 在组件完成反激活流程后执行,可以用于确认清理完成或执行最终操作
9191
/// </remarks>
92-
Task AfterInActivation();
92+
Task<bool> AfterInActivation();
9393

9494
/// <summary>
9595
/// 根据代理类型获取代理组件

GameFrameX.Core/Components/BaseComponent.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ public void ClearCacheAgent()
7373
/// <returns>激活任务</returns>
7474
public virtual Task Active()
7575
{
76+
if (IsActive)
77+
{
78+
return Task.CompletedTask;
79+
}
80+
7681
IsActive = true;
7782
return Task.CompletedTask;
7883
}

GameFrameX.Core/Hotfix/Agent/BaseComponentAgent.cs

Lines changed: 107 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,47 +68,142 @@ public void SetOwner(IComponent owner)
6868
Owner = owner;
6969
}
7070

71+
/// <summary>
72+
/// 标记组件是否已执行过激活前预处理
73+
/// </summary>
74+
protected bool IsInvokedBeforeActivation { get; private set; }
75+
7176
/// <summary>
7277
/// 组件激活前的预处理操作
7378
/// </summary>
74-
/// <returns>一个已完成的任务</returns>
75-
public virtual Task BeforeActivation() => Task.CompletedTask;
79+
/// <returns>
80+
/// 返回一个 Task&lt;bool&gt; 对象:
81+
/// - true:表示预处理成功且是首次执行
82+
/// - false:表示已经执行过预处理
83+
/// </returns>
84+
public virtual Task<bool> BeforeActivation()
85+
{
86+
if (IsInvokedBeforeActivation)
87+
{
88+
return Task.FromResult(false);
89+
}
90+
91+
IsInvokedBeforeActivation = true;
92+
93+
return Task.FromResult(true);
94+
}
95+
96+
/// <summary>
97+
/// 标记组件是否已执行过激活操作
98+
/// </summary>
99+
protected bool IsInvokedActivation { get; private set; }
76100

77101
/// <summary>
78102
/// 激活组件
79103
/// </summary>
80-
/// <returns>一个已完成的任务</returns>
81-
public virtual Task Active()
104+
/// <returns>
105+
/// 返回一个 Task&lt;bool&gt; 对象:
106+
/// - true:表示激活成功且是首次执行
107+
/// - false:表示组件已经被激活过
108+
/// </returns>
109+
public virtual Task<bool> Active()
82110
{
83-
return Task.CompletedTask;
111+
if (IsInvokedActivation)
112+
{
113+
return Task.FromResult(false);
114+
}
115+
116+
IsInvokedActivation = true;
117+
118+
return Task.FromResult(true);
84119
}
85120

121+
/// <summary>
122+
/// 标记组件是否已执行过激活后处理
123+
/// </summary>
124+
protected bool IsInvokedAfterActivation { get; private set; }
125+
86126
/// <summary>
87127
/// 组件激活后的后处理操作
88128
/// </summary>
89-
/// <returns>一个已完成的任务</returns>
90-
public virtual Task AfterActivation() => Task.CompletedTask;
129+
/// <returns>
130+
/// 返回一个 Task&lt;bool&gt; 对象:
131+
/// - true:表示后处理成功且是首次执行
132+
/// - false:表示已经执行过后处理
133+
/// </returns>
134+
public virtual Task<bool> AfterActivation()
135+
{
136+
if (IsInvokedAfterActivation)
137+
{
138+
return Task.FromResult(false);
139+
}
140+
141+
IsInvokedAfterActivation = true;
142+
143+
return Task.FromResult(true);
144+
}
145+
146+
/// <summary>
147+
/// 标记组件是否已执行过反激活前预处理
148+
/// </summary>
149+
protected bool IsInvokedBeforeInActivation { get; private set; }
91150

92151
/// <summary>
93152
/// 组件反激活前的预处理操作
94153
/// </summary>
95-
/// <returns>一个已完成的任务</returns>
96-
public virtual Task BeforeInActivation() => Task.CompletedTask;
154+
/// <returns>
155+
/// 返回一个 Task&lt;bool&gt; 对象:
156+
/// - true:表示预处理成功且是首次执行
157+
/// - false:表示已经执行过预处理
158+
/// </returns>
159+
public virtual Task<bool> BeforeInActivation()
160+
{
161+
if (IsInvokedBeforeInActivation)
162+
{
163+
return Task.FromResult(false);
164+
}
165+
166+
IsInvokedBeforeInActivation = true;
167+
168+
return Task.FromResult(true);
169+
}
97170

98171
/// <summary>
99172
/// 反激活组件
100173
/// </summary>
101-
/// <returns>一个已完成的任务</returns>
174+
/// <returns>
175+
/// 返回一个已完成的 Task 对象。
176+
/// 注意:此方法不检查执行状态,可以多次调用
177+
/// </returns>
102178
public virtual Task Inactive()
103179
{
104180
return Task.CompletedTask;
105181
}
106182

183+
/// <summary>
184+
/// 标记组件是否已执行过反激活后处理
185+
/// </summary>
186+
protected bool IsInvokedAfterInActivation { get; private set; }
187+
107188
/// <summary>
108189
/// 组件反激活后的后处理操作
109190
/// </summary>
110-
/// <returns>一个已完成的任务</returns>
111-
public virtual Task AfterInActivation() => Task.CompletedTask;
191+
/// <returns>
192+
/// 返回一个 Task&lt;bool&gt; 对象:
193+
/// - true:表示后处理成功且是首次执行
194+
/// - false:表示已经执行过后处理
195+
/// </returns>
196+
public virtual Task<bool> AfterInActivation()
197+
{
198+
if (IsInvokedAfterInActivation)
199+
{
200+
return Task.FromResult(false);
201+
}
202+
203+
IsInvokedAfterInActivation = true;
204+
205+
return Task.FromResult(true);
206+
}
112207

113208
/// <summary>
114209
/// 根据代理类型获取组件代理实例

GameFrameX.Hotfix/Logic/Server/ServerComponentAgent.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@ namespace GameFrameX.Hotfix.Logic.Server;
99

1010
public class ServerComponentAgent : StateComponentAgent<ServerComponent, ServerState>
1111
{
12-
public override async Task Active()
12+
public override async Task<bool> Active()
1313
{
14-
// 跨天定时器
15-
WithCronExpression<CrossDayTimeHandler>("0 0 0 * * ? *");
16-
if (State.FirstStartTime == default)
14+
var isContinue = await base.Active();
15+
if (isContinue)
1716
{
18-
State.FirstStartTime = TimeHelper.UnixTimeSeconds();
19-
await OwnerComponent.WriteStateAsync();
17+
// 跨天定时器
18+
WithCronExpression<CrossDayTimeHandler>("0 0 0 * * ? *");
19+
if (State.FirstStartTime == default)
20+
{
21+
State.FirstStartTime = TimeHelper.UnixTimeSeconds();
22+
await OwnerComponent.WriteStateAsync();
23+
}
2024
}
25+
26+
return isContinue;
2127
}
2228

2329
[Service]

0 commit comments

Comments
 (0)