Files
hjha-server/ServerCore/CoroutineLock/CoroutineLockQueue.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

100 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MrWu.Debug;
namespace Server.Core
{
public class CoroutineLockQueue : Reference
{
/// <summary>
/// CoroutineLockType
/// </summary>
public int Type { get; private set; }
public long Key { get; private set; }
public CoroutineLockManager CoroutineLockManager { get; private set; }
private ObjectRef<CoroutineLock> currentCoroutineLock;
public CoroutineLock CurrentCoroutineLock
{
get { return this.currentCoroutineLock; }
set { this.currentCoroutineLock = value; }
}
private readonly Queue<WaitCoroutineLock> queue = new Queue<WaitCoroutineLock>();
public int Count
{
get { return this.queue.Count; }
}
public static CoroutineLockQueue Create(int type, long key, CoroutineLockManager coroutineLockManager)
{
CoroutineLockQueue coroutineLockQueue = ReferencePool.Fetch<CoroutineLockQueue>();
coroutineLockQueue.Type = type;
coroutineLockQueue.Key = key;
coroutineLockQueue.CoroutineLockManager = coroutineLockManager;
return coroutineLockQueue;
}
public override void Dispose()
{
this.queue.Clear();
this.Type = CoroutineLockType.None;
this.CurrentCoroutineLock = null;
this.CoroutineLockManager = null;
ReferencePool.Recycle(this);
}
private CoroutineLock New(int level)
{
CoroutineLock coroutineLock =
CoroutineLock.Create(this.Type, Key, level, CoroutineLockManager);
return coroutineLock;
}
public async Task<CoroutineLock> Wait(int time)
{
if (this.CurrentCoroutineLock == null)
{
CoroutineLock coroutineLock = New(1);
this.CurrentCoroutineLock = coroutineLock;
Debug.Log("第一个锁,直接返回!");
return coroutineLock;
}
WaitCoroutineLock waitCoroutineLock = WaitCoroutineLock.Create();
this.queue.Enqueue(waitCoroutineLock);
if (time > 0)
{
// 超时处理
}
Debug.Log($"添加到等待队列:{Count}");
this.CurrentCoroutineLock = await waitCoroutineLock.Wait();
return this.CurrentCoroutineLock;
}
public bool Notify(int level)
{
while (this.queue.Count > 0)
{
WaitCoroutineLock waitCoroutineLock = this.queue.Dequeue();
if (waitCoroutineLock.IsDisposed())
{
continue;
}
CoroutineLock coroutineLock = New(level);
waitCoroutineLock.SetResult(coroutineLock);
return true;
}
return false;
}
}
}