在已经工作的方法中使用Task.WhenAll

问题描述 投票:0回答:1

我有在

foreach

中运行另一个私有方法的方法

这是主要方法

 public async Task<IList<IssueResponse>> GetIssuesAsync(string query, string email)
{
    var fields =
        $@"key,summary,description,status,issuetype,updated,created,attachment,assignee,reporter,
            {IssueFields.RequestType}, {IssueFields.ApproversField},
            {IssueFields.MinimumNotificationsReportersField}, {IssueFields.MinimumNotificationsUsersField},
            {IssueFields.StandardNotificationsReportersField}, {IssueFields.StandardNotificationsUsersField}, {IssueFields.StandardNotificationsAssigneeField},
            {IssueFields.FullNotificationsReportersField}, {IssueFields.FullNotificationsUsersField}, {IssueFields.FullNotificationsAssigneeField}";

    var expand = "renderedFields";

    var queryParams = new Dictionary<string, string>
    {
        { "jql", query },
        { "maxResults", "100" },
        { "validateQuery", "false" },
        { "fields", fields },
        { "expand", expand }
    };

    var request = this.ConfigureGetRequest("search", queryParams: queryParams);

    var result = await this.SendRequestAsync<IssueListResponse>(request);

    var issues = result.IssueList;

    foreach (var item in issues)
    {
        item.Fields.Attachment = await GetAttachments(item.Key, email);
    }

    return issues;
}

正如你在 foreach 中看到的,我调用了另一种方法

这是代码

 private async Task<List<IssueAttachment>> GetAttachments(string issueKey, string email)
{
    var attachmentRequest = this.ConfigureGetRequest(issueKey, this.settings.GetAttachmentsPathUrl).AddXClientHeader(email);;

    return await this.SendRequestAsync<List<IssueAttachment>>(
               attachmentRequest,
               new List<HttpStatusCode> { HttpStatusCode.OK });
}

如何使用

Task.WhenAll
并行获取附件?

c# asp.net .net asp.net-core
1个回答
0
投票

首先,您只需要枚举或集合中的任务:

var tks = issues.Select(i => GetAttachment(i.Key, email);
await Task.WhenAll(tks)

但这并没有捕获结果。

Task.WhenAll<TResult>(IEnumerable<Task<TResult>)
的返回类型不是
Task<TResult[]>
,因此假设
issues
的枚举是稳定的:

var tks = issues.Select(i => GetAttachment(i.Key, email).ToArray();
var results = await Task.WhenAll(tks);

foreach (var (res, issue) in results.Zip(issues, (t, i) => (t, i))) {
  issue.Fields.Attachment = res;
}

© www.soinside.com 2019 - 2024. All rights reserved.