Service.Manager.Services.JoinService C# (CSharp) Method

JoinService() public method

public JoinService ( IChannel channel, int id, Newtonsoft.Json.Linq.JArray address, int port ) : Service
channel IChannel
id int
address Newtonsoft.Json.Linq.JArray
port int
return Service
        public Service JoinService(IChannel channel, int id, JArray address, int port)
        {
            if (id == -1)
            {
                //_servicesLock.EnterWriteLock();

                id = ++_maxIndex;
                if (_maxIndex >= _services.Length) //공간이 작다. 공간을 늘린다.
                {
                    var temp = new Service[_services.Length];
                    System.Array.Copy(_services, temp, _services.Length);
                    _services = temp;
                }

                _services[id] = new Service(this, id, address, port);

                dynamic packet = new JObject();
                packet.type = "change_service_id";
                packet.id = id;
                channel.SendMessage(packet);
                //_servicesLock.ExitWriteLock();
            }

            //_servicesLock.EnterReadLock();
            var service = _services[id];
            //_servicesLock.ExitReadLock();

            service.AddChannel(channel);

            return service;
        }

Usage Example

Example #1
0
        private void AddService(IChannel channel, Services services, int id, JArray address, int port)
        {
            var service = services.JoinService(channel, id, address, port);

            if (id == -1)
            {
                dynamic packet = new JObject();
                packet.type = "max_entity_id";
                packet.value = 10000;
                channel.SendMessage(packet);

                var networks = _networkManager.GetNetworks(service);

                int notifyServiceCount = 0;
                foreach (var network in networks)
                {
                    var remoteServiceName = network.Service1 == services.GetServicesName() ? network.Service2 : network.Service1;
                    var remoteService = GetServices(remoteServiceName);
                    if (remoteService == null)
                        continue;
                    notifyServiceCount += remoteService.NotifyJoinService(service, network);
                }
                //Interlocked.Increment
                //여기서 광역 락 시전!
                //추가 됬다고 정보를 알린 모든 서비스에서 승인이 떨어지면 다음꺼 처리.
                if (notifyServiceCount > 0)
                {
                    _addremoveService = service;
                    _notifyServiceCount = notifyServiceCount;
                    _nextAddRemoveProcessing = new AutoResetEvent(false);
                    _nextAddRemoveProcessing.WaitOne();
                }
            }
        }