public async Task <IEnumerable <Issue> > GetIssuesAsync1( string ownerName, string repoName, IProgress <int> progress, CancellationToken cancellationToken = default) { const int maxIssuesCount = 100; var issues = new List <Issue>(); var request = new IssuesRequest { OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery }; while (true) { await Task.Delay(100, cancellationToken).ConfigureAwait(false); var response = await PostAsync(request, cancellationToken).ConfigureAwait(false); issues.AddRange(response.Issues); progress?.Report(issues.Count); if (!response.HasMorePages || issues.Count >= maxIssuesCount) { break; } request.StartCursor = response.StartCursor; cancellationToken.ThrowIfCancellationRequested(); } return(issues); }
public async IAsyncEnumerable <Issue> GetIssuesAsync4( string ownerName, string repoName, [EnumeratorCancellation] CancellationToken cancellationToken = default) { var request = new IssuesRequest { OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery }; while (true) { await Task.Delay(100, cancellationToken).ConfigureAwait(false); var response = await PostAsync(request, cancellationToken).ConfigureAwait(false); foreach (var issue in response.Issues) { yield return(issue); } if (!response.HasMorePages) { yield break; } request.StartCursor = response.StartCursor; cancellationToken.ThrowIfCancellationRequested(); } }
public IObservable <Issue> GetIssuesAsync3(string ownerName, string repoName) { return(Observable.Create <Issue>(async(observer, cancellationToken) => { var request = new IssuesRequest { OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery }; while (true) { await Task.Delay(100, cancellationToken).ConfigureAwait(false); var response = await PostAsync(request, cancellationToken).ConfigureAwait(false); foreach (var issue in response.Issues) { observer.OnNext(issue); } if (!response.HasMorePages) { observer.OnCompleted(); break; } request.StartCursor = response.StartCursor; cancellationToken.ThrowIfCancellationRequested(); } })); }
private async Task <IssuesResponse> PostAsync(IssuesRequest request, CancellationToken token) { var postBody = request.ToJsonText(); var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("https://api.github.com/graphql")); httpRequestMessage.Headers.Add("Authorization", $"Token {GitHubAccessToken}"); httpRequestMessage.Content = new StringContent(postBody, Encoding.UTF8, "application/json"); var httpResponseMessage = await myHttpClient.SendAsync(httpRequestMessage, token).ConfigureAwait(false); httpResponseMessage.EnsureSuccessStatusCode(); var responseBody = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); return(IssuesResponse.Parse(responseBody)); }
public IEnumerable <Task <Issue?> > GetIssuesAsync2( string ownerName, string repoName, CancellationToken cancellationToken = default) { var request = new IssuesRequest { OwnerName = ownerName, RepoName = repoName, Query = IssuesQuery }; List <Issue>?currentPage = null; var currentIndex = 0; while (true) { yield return(GetNextIssueAsync()); cancellationToken.ThrowIfCancellationRequested(); } async Task <Issue?> GetNextIssueAsync() { if (currentPage == null || currentIndex >= currentPage.Count) { currentIndex = 0; await Task.Delay(100, cancellationToken).ConfigureAwait(false); var currentResponse = await PostAsync(request, cancellationToken).ConfigureAwait(false); currentPage = currentResponse.Issues.ToList(); if (currentPage.Count == 0) { return(null); } request.StartCursor = currentResponse.StartCursor; } return(currentPage[currentIndex++]); } }