private Task <PersistentResponse> ProcessSignal(SignalResult result, long?messageId = null) { if (result.TimedOut) { PersistentResponse response = GetEmptyResponse(messageId); // Return a task wrapping the result return(TaskAsyncHelper.FromResult(response)); } // Get the response for this message id return(GetResponse(messageId ?? 0) .Then <PersistentResponse, long?>((response, id) => response ?? GetEmptyResponse(id), messageId)); }
private Task FinishAsync(TaskCompletionSource <object> tcs) { return(tcs.Task.ContinueWith(task => { UnsetWorking(); if (task.IsFaulted) { return TaskAsyncHelper.FromError(task.Exception); } return TaskAsyncHelper.Empty; }).FastUnwrap()); }
private Task <IEnumerable <Message> > GetMessages(long id, IEnumerable <string> signals) { var pendingMessagesTasks = (from signal in signals select _store.GetAllSince(signal, id)).ToArray(); // If there are no pending messages, we need to shortcut since ContinueWhenAll // blows up for empty arrays. if (!pendingMessagesTasks.Any()) { return(TaskAsyncHelper.FromResult(Enumerable.Empty <Message>())); } // Wait until all of the tasks are done before we return return(pendingMessagesTasks.AllSucceeded(() => (IEnumerable <Message>)pendingMessagesTasks.SelectMany(t => t.Result).OrderBy(m => m.Id).ToList())); }
public Task <IOrderedEnumerable <Message> > GetAllSince(IEnumerable <string> keys, string id) { long longId; if (!Int64.TryParse(id, NumberStyles.Any, CultureInfo.InvariantCulture, out longId)) { throw new ArgumentException("id must be a valid integer", "id"); } if (longId > _lastMessageId) { longId = 0; } var items = keys.SelectMany(k => GetAllCore(k).Where(item => Int64.Parse(item.Id, CultureInfo.InvariantCulture) > longId)) .OrderBy(item => item.Id); return(TaskAsyncHelper.FromResult <IOrderedEnumerable <Message> >(items)); }
private Task <PersistentResponse> ProcessSignal(Task <SignalResult> signalTask, long?messageId = null) { if (signalTask.Result.TimedOut) { // If we timed out waiting for a signal we have a message id then return null PersistentResponse response = null; // Otherwise ee need to return 0 so that the next request we'll get all messages // on the next try if (messageId == null) { response = new PersistentResponse { MessageId = 0 }; } // Return a task wrapping the result return(TaskAsyncHelper.FromResult(response)); } // Get the response for this message id return(GetResponse(messageId ?? 0)); }