我有在
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
并行获取附件?
首先,您只需要枚举或集合中的任务:
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;
}