/// <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); }