Example #1
0
        /// <summary>
        /// Запуск локального кеша. Необходимо выполнить до начала работы с кешем. Завершение операции может быть только при отмене или исключительной ситуации что является завершением работы локального кеша
        /// </summary>
        /// <param name="connection_string">Строка подключения имеет формат "dc://host_or_ip/cache_endpoint"</param>
        /// <param name="keepalive_interval">Интервал времени для проверки подключения с сервером, по умолчанию равен 90 сек</param>
        /// <param name="reconnect_interval">Время ожидания между подключениями в случае потери соединения, по умолчанию равен 3 сек</param>
        /// <param name="reconnect_count">Количество переподключений при разрыве связи. По истечению метод будет завершен с ошибкой, по умолчанию равен 60</param>
        /// <param name="connect_timeout">Время ожидания подключения к серверу</param>
        /// <param name="token">Токен отмены выполнения</param>
        /// <returns></returns>
        public async Task StartAsync(string connection_string, CancellationToken token, TimeSpan?keepalive_interval = null, TimeSpan?reconnect_interval = null, int?reconnect_count = null, TimeSpan?connect_timeout = null)
        {
            if (_client != null)
            {
                throw new InvalidOperationException();
            }

            var conn = DistributedCacheConnectionString.Parse(connection_string.Split(',').First(),
                                                              keepalive_interval ?? TimeSpan.FromSeconds(90), reconnect_interval ?? TimeSpan.FromSeconds(3), reconnect_count ?? 60, connect_timeout ?? TimeSpan.FromSeconds(10));
            var builder = new UriBuilder("ws", conn.Host, conn.Port, conn.Path);

            _client = new InternalClient(builder.Uri, conn.ConnectionOptions.KeepaliveInterval, conn.ConnectionOptions.ReconnectInterval, conn.ConnectionOptions.ConnectTimeout, conn.ConnectionOptions.ReconnectCount);
            await _client.ConnectAsync(token);

            var cache   = _cache.StartAsync(_batchInterval, token);
            var bacth   = StartBatching(token);
            var receive = StartReceive(token);

            await Task.WhenAny(cache, bacth, receive);
        }