refactor(coroutine): 优化异步操作延续处理逻辑

- 使用while循环替代递归调用避免栈溢出风险
- 改进CAS操作的重试机制提高并发安全性
- 简化空值检查逻辑提升代码可读性
- 优化双重检查锁模式确保线程安全
This commit is contained in:
GeWuYou 2026-02-09 19:16:22 +08:00
parent 01fb7c33ca
commit 6cc2bdfeb5

View File

@ -28,27 +28,32 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion
/// <param name="continuation">要执行的延续操作</param> /// <param name="continuation">要执行的延续操作</param>
public void OnCompleted(Action continuation) public void OnCompleted(Action continuation)
{ {
// 尝试添加延续 while (true)
var current = _continuation;
var newContinuation = current == null ? continuation : current + continuation;
if (Interlocked.CompareExchange(ref _continuation, newContinuation, current) != current)
{ {
// 如果CAS失败说明可能已经完成直接执行 // 尝试添加延续
var current = _continuation;
var newContinuation = current == null ? continuation : current + continuation;
if (Interlocked.CompareExchange(ref _continuation, newContinuation, current) != current)
{
// 如果CAS失败说明可能已经完成直接执行
if (_completed)
continuation();
else
// 重试
continue;
return;
}
// 双重检查:如果在设置延续后发现已完成,需要执行延续
if (_completed) if (_completed)
continuation(); {
else var cont = Interlocked.Exchange(ref _continuation, null);
// 重试 cont?.Invoke();
OnCompleted(continuation); }
return; break;
}
// 双重检查:如果在设置延续后发现已完成,需要执行延续
if (_completed)
{
var cont = Interlocked.Exchange(ref _continuation, null);
if (cont != null) cont();
} }
} }