异步/等待具有相同返回类型

时间:2015-07-06 21:33:43

标签: c# .net asynchronous async-await

我正在尝试异步上传文件到S3存储桶。我可以使用以下代码成功完成此操作。

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

UploadImagesUploadAttachments都返回IEnumerable EntityUploadResult。如何在Parallel中执行它们并在完成后返回结果?

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)));
}

2 个答案:

答案 0 :(得分:6)

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

但是,如果你想用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();
}

答案 1 :(得分:2)

awaitWhenAll同时使用Result,然后通过WhenAll的返回结果检查await Task.WhenAll(images, attachments); var imgResult = images.Result; var attResult = attachments.Result; 或if(如本例所示):

如果两种类型不同,你可以这样做(如果类型相同,也是一个选项);

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));

可以替换为:

 public class UserInfo : ADItemInfo
    {
    public UserInfo();
    public string FirstName{ get; set; }
    public string LastName { get; set; }
    public string EmployeeID { get; set; }
    }