internal Task RemoveAllSubscriptions(CommandFlags flags, object asyncState) { Task last = CompletedTask <bool> .Default(asyncState); lock (subscriptions) { foreach (var pair in subscriptions) { pair.Value.Remove(null); // always wipes var task = pair.Value.UnsubscribeFromServer(pair.Key, flags, asyncState, false); if (task != null) { last = task; } } subscriptions.Clear(); } return(last); }
internal Task RemoveSubscription(RedisChannel channel, Action <RedisChannel, RedisValue> handler, CommandFlags flags, object asyncState) { lock (subscriptions) { Subscription sub; if (subscriptions.TryGetValue(channel, out sub)) { if (sub.Remove(handler)) { subscriptions.Remove(channel); var task = sub.UnsubscribeFromServer(channel, flags, asyncState, false); if (task != null) { return(task); } } } } return(CompletedTask <bool> .Default(asyncState)); }
internal override Task <T> ExecuteAsync <T>(Message message, ResultProcessor <T> processor, ServerEndPoint server = null) { // inject our expected server automatically if (server == null) { server = this.server; } FixFlags(message, server); if (!server.IsConnected) { if (message == null) { return(CompletedTask <T> .Default(asyncState)); } if (message.IsFireAndForget) { return(CompletedTask <T> .Default(null)); // F+F explicitly does not get async-state } // no need to deny exec-sync here; will be complete before they see if var tcs = TaskSource.Create <T>(asyncState); ConnectionMultiplexer.ThrowFailed(tcs, ExceptionFactory.NoConnectionAvailable(multiplexer.IncludeDetailInExceptions, message.Command, message, server, multiplexer.GetServerSnapshot())); return(tcs.Task); } return(base.ExecuteAsync <T>(message, processor, server)); }