public void Close() { var tmp = Socket; lock (this) { // 简单保护一下,Close 正常程序退出的时候才调用这个,应该不用保护。 if (null == Socket) { return; } Socket = null; // 正常关闭,先设置这个,以后 OnSocketClose 的时候判断做不同的处理。 } if (Logined.Task.IsCompletedSuccessfully) { var normalClose = new GlobalCacheManager.NormalClose(); var future = new TaskCompletionSource <int>(); normalClose.Send(tmp, (_) => { if (normalClose.IsTimeout) { future.SetResult(-100); // 关闭错误就不抛异常了。 } else { future.SetResult(normalClose.ResultCode); if (normalClose.ResultCode != 0) { logger.Error("GlobalAgent:NormalClose ResultCode={0}", normalClose.ResultCode); } } return(0); }); future.Task.Wait(); } Logined.TrySetException(new Exception("GlobalAgent.Close")); // 这个,,,, tmp.Dispose(); }
public void OnSocketClose(GlobalClient client, Exception ex) { lock (this) { if (null == Socket) { // active close return; } Socket = null; } if (Logined.Task.IsCompletedSuccessfully) { foreach (var database in client.Zeze.Databases.Values) { foreach (var table in database.Tables) { table.ReduceInvalidAllLocalOnly(GlobalCacheManagerHashIndex); } } client.Zeze.CheckpointRun(); } Logined.TrySetException(ex); // 连接关闭,这个继续保持。仅在Connect里面需要时创建。 }