using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Service; namespace Milimoe.FunGame.Core.Controller { /// /// 继承 AsyncAwaiter 用法: /// 1、调用Socket.Send()前,请设置为等待状态:SetWorking(); /// 2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone(); /// 3、在其他任何地方修改Working状态,均会使任务终止。 /// public class SocketHandlerController : AsyncAwaiter, ISocketHandler, IDisposable { /// /// 接收到的SocketObject实例 /// protected override SocketObject Work { get; set; } /// /// Socket /// private readonly Socket _Socket; /// /// 继承请调用base构造 /// /// Socket public SocketHandlerController(Socket? socket) { if (socket != null) { _Socket = socket; socket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler)); } else throw new SocketCreateReceivingException(); } /// /// 继承请重写此方法 /// /// SocketObject public virtual void SocketHandler(SocketObject SocketObject) { } /// /// 判断是否已经Disposed /// private bool IsDisposed = false; /// /// 公开的Dispose方法 /// public void Dispose() { OnDisposed(); Dispose(true); GC.SuppressFinalize(this); } /// /// 关闭时 /// /// protected void Dispose(bool Disposing) { if (!IsDisposed) { if (Disposing) { _Socket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler), true); } } IsDisposed = true; } /// /// 关闭事件 /// /// SocketObject protected delegate void DisposedEvent(); /// /// Controller关闭时事件 /// 不建议new Dispose()方法,建议使用事件 /// 事件会在base.Dispose()执行前触发 /// protected event DisposedEvent? Disposed; /// /// 触发关闭事件 /// /// SocketObject protected void OnDisposed() { Disposed?.Invoke(); } } }