/// <summary> /// Begins to get messages of specified member asynchronously. /// </summary> /// <param name="teamName">Name of the Scrum team.</param> /// <param name="memberName">Name of the member.</param> /// <param name="lastMessageId">ID of last message the member received.</param> /// <param name="cancellationToken">The cancellation token to cancel operation.</param> /// <returns> /// List of messages. /// </returns> public async Task <IList <Message> > GetMessages(string teamName, string memberName, long lastMessageId, CancellationToken cancellationToken) { var encodedTeamName = _urlEncoder.Encode(teamName); var encodedMemberName = _urlEncoder.Encode(memberName); var encodedLastMessageId = _urlEncoder.Encode(lastMessageId.ToString(CultureInfo.InvariantCulture)); var uri = $"GetMessages?teamName={encodedTeamName}&memberName={encodedMemberName}&lastMessageId={encodedLastMessageId}"; var result = await GetJsonAsync <List <Message> >(uri, cancellationToken); ScrumTeamMapper.ConvertMessages(result); return(result); }
/// <summary> /// Begins to get messages of specified member asynchronously. /// </summary> /// <param name="teamName">Name of the Scrum team.</param> /// <param name="memberName">Name of the member.</param> /// <param name="lastMessageId">ID of last message the member received.</param> /// <param name="cancellationToken">The cancellation token to cancel operation.</param> /// <returns> /// List of messages. /// </returns> public Task <IList <Message> > GetMessages(string teamName, string memberName, long lastMessageId, CancellationToken cancellationToken) { return(InvokeOperation(async() => { await EnsureConnected(cancellationToken); try { Task <IList <Message> > getMessagesTask; lock (_getMessagesLock) { if (_getMessagesTask != null) { throw new InvalidOperationException("GetMessages is already in progress."); } _getMessagesTask = new TaskCompletionSource <IList <Message> >(); getMessagesTask = _getMessagesTask.Task; } await _hubConnection.InvokeAsync("GetMessages", teamName, memberName, lastMessageId, cancellationToken); var result = await getMessagesTask; ScrumTeamMapper.ConvertMessages(result); return result; } finally { lock (_getMessagesLock) { _getMessagesTask?.TrySetCanceled(); _getMessagesTask = null; } } })); }