refactor(coroutine): 优化协程调度器实现

- 在 CoroutineSlot 中添加 Handle 属性用于标识协程实例
- 使用集合初始化语法替换 HashSet 创建方式
- 简化协程执行状态检查逻辑
- 优化 KillAllByTag 方法中的计数逻辑
- 改进协程清理过程中的句柄验证和等待者唤醒机制
This commit is contained in:
GeWuYou 2026-01-23 12:42:06 +08:00
parent a79f02c987
commit bf517a4f7f
2 changed files with 24 additions and 40 deletions

View File

@ -56,7 +56,8 @@ public sealed class CoroutineScheduler(
var slot = new CoroutineSlot var slot = new CoroutineSlot
{ {
Enumerator = coroutine, Enumerator = coroutine,
State = CoroutineState.Running State = CoroutineState.Running,
Handle = handle
}; };
_slots[slotIndex] = slot; _slots[slotIndex] = slot;
@ -88,7 +89,7 @@ public sealed class CoroutineScheduler(
for (var i = 0; i < _nextSlot; i++) for (var i = 0; i < _nextSlot; i++)
{ {
var slot = _slots[i]; var slot = _slots[i];
if (slot == null || slot.State != CoroutineState.Running) if (slot is not { State: CoroutineState.Running })
continue; continue;
try try
@ -207,7 +208,7 @@ public sealed class CoroutineScheduler(
if (!_waiting.TryGetValue(target, out var set)) if (!_waiting.TryGetValue(target, out var set))
{ {
set = new HashSet<CoroutineHandle>(); set = [];
_waiting[target] = set; _waiting[target] = set;
} }
@ -223,15 +224,8 @@ public sealed class CoroutineScheduler(
{ {
if (!_tagged.TryGetValue(tag, out var handles)) if (!_tagged.TryGetValue(tag, out var handles))
return 0; return 0;
var copy = handles.ToArray(); var copy = handles.ToArray();
var count = 0; return copy.Count(Kill);
foreach (var h in copy)
if (Kill(h))
count++;
return count;
} }
/// <summary> /// <summary>
@ -294,43 +288,28 @@ public sealed class CoroutineScheduler(
if (slot == null) if (slot == null)
return; return;
_slots[slotIndex] = null; var handle = slot.Handle;
_activeCount--;
CoroutineHandle handle = default;
foreach (var kv in _metadata)
{
if (kv.Value.SlotIndex == slotIndex)
{
handle = kv.Key;
break;
}
}
if (!handle.IsValid) if (!handle.IsValid)
return; return;
_slots[slotIndex] = null;
_activeCount--;
RemoveTag(handle); RemoveTag(handle);
_metadata.Remove(handle); _metadata.Remove(handle);
// 唤醒等待者 // 唤醒等待者
if (_waiting.TryGetValue(handle, out var waiters)) if (!_waiting.TryGetValue(handle, out var waiters)) return;
foreach (var waiter in waiters)
{ {
foreach (var waiter in waiters) if (!_metadata.TryGetValue(waiter, out var meta)) continue;
{ var s = _slots[meta.SlotIndex];
if (_metadata.TryGetValue(waiter, out var meta)) if (s == null) continue;
{ s.State = CoroutineState.Running;
var s = _slots[meta.SlotIndex]; meta.State = CoroutineState.Running;
if (s != null)
{
s.State = CoroutineState.Running;
meta.State = CoroutineState.Running;
}
}
}
_waiting.Remove(handle);
} }
_waiting.Remove(handle);
} }
/// <summary> /// <summary>

View File

@ -21,4 +21,9 @@ internal sealed class CoroutineSlot
/// 当前等待的指令,用于控制协程的暂停和恢复 /// 当前等待的指令,用于控制协程的暂停和恢复
/// </summary> /// </summary>
public IYieldInstruction? Waiting; public IYieldInstruction? Waiting;
/// <summary>
/// 协程句柄,用于标识和管理协程实例
/// </summary>
public CoroutineHandle Handle;
} }