using System.Collections.Concurrent;
using Milimoe.FunGame.Core.Library.Server;
namespace Milimoe.FunGame.Core.Service
{
internal class ThreadManager
{
///
/// 目前的线程数量
///
internal int Count => Threads.Count;
///
/// 最大接受的线程数量
///
private int MaxThread { get; }
///
/// 可参与高并发的字典,但添加效率较低
///
private ConcurrentDictionary Threads { get; } = new();
///
/// Init ThreadManager
///
/// MaxThread
internal ThreadManager(int MaxThread = 0)
{
if (MaxThread <= 0)
this.MaxThread = Library.Constant.General.MaxThread_General;
else
{
this.MaxThread = MaxThread;
}
}
///
/// 获取Thread对象
///
/// Thread的Key
/// Thread对象
internal BaseModel this[string name] => Threads[name];
///
/// 向线程管理器中添加Thread
///
/// Thread的Key
/// Thread对象
/// True:操作成功
internal bool Add(string name, BaseModel t)
{
if (Threads.Count + 1 > MaxThread) return false;
return Threads.TryAdd(name, t);
}
///
/// 从线程管理器中移除Thread
///
/// Thread的Key
/// True:操作成功
internal bool Remove(string name)
{
return Threads.TryRemove(name, out _);
}
///
/// 将Thread移除,并取得这个Thread
///
/// Thread的Key
/// Thread对象
/// 被移除的Thread
internal bool Remove(string name, ref BaseModel? t)
{
return Threads.TryRemove(name, out t);
}
///
/// 将Thread移除,并取得这个Thread
///
/// Thread的Key
/// 被移除的Thread
internal BaseModel? RemoveAndGet(string name)
{
Threads.TryRemove(name, out BaseModel? result);
return result;
}
internal bool ContainsKey(string name)
{
return Threads.ContainsKey(name);
}
///
/// 清空线程管理器
///
internal void Clear()
{
Threads.Clear();
}
///
/// 获取线程对象的列表
///
internal List GetList()
{
return Threads.Values.ToList();
}
}
}