我正在尝试异步上传文件到S3存储桶。我可以使用以下代码成功完成此操作。
我似乎无法弄清楚如何处理两种同时具有相同返回类型的不同方法。
UploadImages
和UploadAttachments
都返回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)));
}
答案 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)
await
与WhenAll
同时使用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; }
}