private void PingAndUpdateTransportInfoAsync(TLDCOption78 dcOption, ITransport transport, Action callback, Action <TLRPCError> faultCallback = null)
        {
            LogPublicConfig(string.Format("Ping id={0} dc_id={1} ip={2} port={3} secret={4} proxy=[{5}]", transport.Id, transport.DCId, transport.Host, transport.Port, transport.Secret != null, transport.ProxyConfig));

            PingByTransportAsync(transport, TLLong.Random(),
                                 pong =>
            {
                LogPublicConfig(string.Format("Ping completed id={0}", transport.Id));

                LogPublicConfig("Close transport id=" + transport.Id);
                _transportService.CloseSpecialTransport(transport);

                LogPublicConfig(string.Format("Update info dc_id={0} ip={1} port={2} secret={3}", transport.DCId, transport.Host, transport.Port, transport.Secret != null));
                UpdateTransportInfoAsync(dcOption, new TLString(transport.Host), new TLInt(transport.Port),
                                         result =>
                {
                    LogPublicConfig("Update info completed");
                    callback.SafeInvoke();
                });
            },
                                 error =>
            {
                LogPublicConfig(string.Format("Ping error id={0} error={1}", transport.Id, error));
                _transportService.CloseSpecialTransport(transport);
                faultCallback.SafeInvoke(error);
            });
        }
        private void CheckAndUpdateTransportInfoInternalAsync(TLDCOption78 dcOption, ITransport transport, Action callback, Action <TLRPCError> faultCallback = null)
        {
            if (transport.AuthKey == null)
            {
                InitTransportAsync(transport,
                                   tuple =>
                {
                    LogPublicConfig(string.Format("Init transport completed id={0}", transport.Id));
                    lock (transport.SyncRoot)
                    {
                        transport.AuthKey   = tuple.Item1;
                        transport.Salt      = tuple.Item2;
                        transport.SessionId = tuple.Item3;

                        transport.IsInitializing = false;
                    }
                    var authKeyId = TLUtils.GenerateLongAuthKeyId(tuple.Item1);

                    lock (_authKeysRoot)
                    {
                        if (!_authKeys.ContainsKey(authKeyId))
                        {
                            _authKeys.Add(authKeyId, new AuthKeyItem {
                                AuthKey = tuple.Item1, AutkKeyId = authKeyId
                            });
                        }
                    }

                    PingAndUpdateTransportInfoAsync(dcOption, transport, callback, faultCallback);
                },
                                   error =>
                {
                    LogPublicConfig(string.Format("Init transport error id={0} error={1}", transport.Id, error));
                });
            }
            else
            {
                PingAndUpdateTransportInfoAsync(dcOption, transport, callback, faultCallback);
            }
        }