public SampleService(IFoo foo, IBar bar, ISingleton singleton, ITransient transient, IAsyncClass asyncClass) { _id = Guid.NewGuid(); _foo = foo ?? throw new ArgumentNullException(nameof(foo)); _bar = bar ?? throw new ArgumentNullException(nameof(bar)); _singleton = singleton ?? throw new ArgumentNullException(nameof(singleton)); _transient = transient ?? throw new ArgumentNullException(nameof(transient)); _asyncClass = asyncClass ?? throw new ArgumentNullException(nameof(asyncClass)); }
void AsyncMessageRecieved(ASyncPackage package) { IAsyncClass asyncClass; if (package.Message is TcpRemoteCloseException) { //Tcp connection closed //Release all classes lock (_ClassIdLock) { IAsyncClass[] iAsyncClass; lock (_LockObj) { iAsyncClass = new IAsyncClass[_ClassDict.Count]; _ClassDict.Values.CopyTo(iAsyncClass, 0); } foreach (IAsyncClass aClass in iAsyncClass) { try { aClass.ReceiveMessage(package.Message); } catch { } } lock (_LockObj) { _ClassDict.Clear(); } } return; } lock (_ClassIdLock) { if (!_ClassDict.TryGetValue(package.ClassId, out asyncClass)) { //If hubblecommand query timeout //It will not find the class id when package return from server. //Doesn't matter Console.WriteLine(string.Format("AsyncTcp Manager, class id = {0} is not find", package.ClassId)); return; } } asyncClass.ReceiveMessage(package.Message); }
internal int GetClassId(IAsyncClass asyncClass) { lock (_ClassIdLock) { _ClassId++; if (_ClassId == int.MaxValue) { _ClassId = 0; } _ClassDict.Add(_ClassId, asyncClass); return(_ClassId); } }