async/await WhenAll 在两个具有相同返回类型的方法上
本文关键字:返回类型 方法 两个 WhenAll await async | 更新日期: 2023-09-27 18:01:13
我正在尝试将文件异步上传到 S3 存储桶。我能够使用以下代码成功做到这一点。
我似乎无法弄清楚如何同时处理具有相同返回类型的两种不同方法。
UploadImages
和 UploadAttachments
都返回 IEnumerable
EntityUploadResult
。如何在并行中执行它们并在它们都完成后返回结果?
public async Task<List<EntityUploadResult>> BulkUploadFiles(IEnumerable<BulkUploadFile> files)
{
var results = new List<EntityUploadResult>();
var images = UploadImages(files.Where(x => x.FileType == BulkFileType.Image).AsEnumerable());
var attachments = UploadAttachments(files.Where(x => x.FileType == BulkFileType.Attachment).AsEnumerable());
results.AddRange(await images);
results.AddRange(await attachments);
return results;
}
private async Task<IEnumerable<EntityUploadResult>> UploadImages(IEnumerable<BulkUploadFile> files)
{
return await Task.WhenAll(files.Select(i => UploadImage(i)));
}
private async Task<IEnumerable<EntityUploadResult>> UploadAttachments(IEnumerable<BulkUploadFile> files)
{
return await Task.WhenAll(files.Select(i => UploadAttachment(i)));
}
首先,这就是您已经通过启动两个操作然后等待它们来做的事情。
但是,如果您想使用 Task.WhenAll
并且只等待一次,您可以使用返回值,它是所有操作返回值的集合,并将它们与SelectMany
public async Task<List<EntityUploadResult>> BulkUploadFiles(IEnumerable<BulkUploadFile> files)
{
var images = UploadImages(files.Where(x => x.FileType == BulkFileType.Image).AsEnumerable());
var attachments = UploadAttachments(files.Where(x => x.FileType == BulkFileType.Attachment).AsEnumerable());
var results = await Task.WhenAll(images, attachments);
return results.SelectMany(_ => _).ToList();
}
await
与它们一起WhenAll
,然后稍后检查Result
,或者如果(在本例中(通过WhenAll
返回的结果:
如果两种类型不同,您可以执行此操作(如果类型相同,也可以选择(;
await Task.WhenAll(images, attachments);
var imgResult = images.Result;
var attResult = attachments.Result;
当它们属于同一类型时,您还可以执行以下操作:
IEnumerable<IEnumerable<EntityUploadResult>> = await Task.WhenAll(images, attachments);
因此,您的台词:
results.AddRange(await images);
results.AddRange(await attachments);
可以替换为:
results.AddRange((await Task.WhenAll(images, attachments)).SelectMany(u => u));