async/await WhenAll 在两个具有相同返回类型的方法上

本文关键字:返回类型 方法 两个 WhenAll await async | 更新日期: 2023-09-27 18:01:13

我正在尝试将文件异步上传到 S3 存储桶。我能够使用以下代码成功做到这一点。

我似乎无法弄清楚如何同时处理具有相同返回类型的两种不同方法。

UploadImagesUploadAttachments 都返回 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)));
}

async/await WhenAll 在两个具有相同返回类型的方法上

首先,这就是您已经通过启动两个操作然后等待它们来做的事情。

但是,如果您想使用 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));