//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Collections.Concurrent; using System.Threading.Tasks; using TouchSocket.Core; namespace TouchSocket.Sockets { /// /// Client工厂 /// public abstract class ClientFactory : DisposableObject where TClient : IClient { /// /// Client工厂 /// public ClientFactory() { this.MainConfig = new TouchSocketConfig(); } /// /// 已创建的客户端安全列表,一般不要直接操作。 /// public ConcurrentList CreatedClients { get; } = new ConcurrentList(); /// /// 空闲客户端的安全队列,一般不要直接操作。 /// public ConcurrentQueue FreeClients { get; } = new ConcurrentQueue(); /// /// 主通信客户端。 /// public abstract TClient MainClient { get; } /// /// 主客户端配置 /// /// public virtual TouchSocketConfig MainConfig { get; } /// /// 最大客户端数量。默认10。 /// public int MaxCount { get; set; } = 10; /// /// 池中维护的最小客户端数量。默认0。 /// public int MinCount { get; set; } /// /// 检验主通信状态。最好在每次操作时都调用。 /// /// 如果状态异常,是否进行再次初始化 /// public abstract Result CheckStatus(bool tryInit = true); /// /// 检验主通信状态。最好在每次操作时都调用。 /// /// 如果状态异常,是否进行再次初始化 /// public virtual Task CheckStatusAsync(bool tryInit = true) { return Task.Run(() => { return this.CheckStatus(tryInit); }); } /// /// 清理池中的所有客户端。 /// /// public virtual Task ClearAsync() { return Task.Run(() => { return this.Clear(); }); } /// /// 清理池中的所有客户端。 /// /// public virtual int Clear() { int count = 0; foreach (var item in this.CreatedClients) { count++; DisposeClient(item); } FreeClients.Clear(); return count; } /// /// 释放客户端最后的调用。 /// /// public abstract void DisposeClient(TClient client); /// /// 释放客户端最后的调用。 /// /// /// public virtual Task DisposeClientAsync(TClient client) { return Task.Run(() => { this.DisposeClient(client); }); } /// /// 获取空闲可用的客户端数量。 /// public abstract int GetAvailableCount(); /// /// 获取用于传输的客户端。在此处返回的结果,必须完成基本初始化,例如连接等。 /// /// /// public abstract TClient GetTransferClient(TimeSpan waitTime); /// /// 判断客户端是不是存活状态。 /// /// /// public abstract bool IsAlive(TClient client); /// /// 释放使用完成的客户端 /// /// public abstract void ReleaseTransferClient(TClient client); /// /// 释放使用完成的客户端 /// /// /// public virtual Task ReleaseTransferClientAsync(TClient client) { return Task.Run(() => { this.ReleaseTransferClient(client); }); } /// protected override void Dispose(bool disposing) { base.Dispose(disposing); DisposeClient(MainClient); this.Clear(); } /// /// 获取用于传输的客户端配置 /// /// protected abstract TouchSocketConfig GetTransferConfig(); } }