/// <summary> /// 사용중인 리소스를 반환하고 소켓을 종료하여 네트워크 작업을 종료합니다. /// 종료처리 후 EventClose가 호출됩니다. /// </summary> public virtual void Close(int reason = AegisResult.Ok) { try { // 작업 중 다른 이벤트가 처리되지 못하도록 Clear까지 lock을 걸어야 한다. lock (this) { if (Socket == null) { return; } Socket.LingerState = new LingerOption(true, 3); Socket.Close(); Socket = null; Inactivated?.Invoke(this); SpinWorker.Dispatch(() => { EventClose?.Invoke(new IOEventResult(this, IOEventType.Close, reason)); }); _method.Clear(); } } catch (Exception e) { Logger.Err(LogMask.Aegis, e.ToString()); } }
/// <summary> /// 사용중인 리소스를 반환하고 소켓을 종료하여 네트워크 작업을 종료합니다. /// 종료 처리가 진행되기 이전에 OnClose 함수가 호출됩니다. /// </summary> public virtual void Close() { try { // 작업 중 다른 이벤트가 처리되지 못하도록 Clear까지 lock을 걸어야 한다. lock (this) { if (Socket == null) { return; } Socket.LingerState = new LingerOption(true, 3); Socket.Close(); Socket = null; if (Inactivated != null) { Inactivated(this); } SpinWorker.Dispatch(() => { if (NetworkEvent_Closed != null) { NetworkEvent_Closed(this); } }); _method.Clear(); } } catch (Exception e) { Logger.Write(LogType.Err, 1, e.ToString()); } }