Я пишу консольное приложение для переноса данных между устаревшей системой и новой версией. С каждой записью связаны изображения, хранящиеся на одном веб-сервере, и я загружаю / изменяю / загружаю каждое изображение в Azure (а также записываю некоторые данные о каждом изображении в базу данных).
Вот примерный план в коде:
public void MigrateData()
{
var records = GetRecords();
foreach (var record in records)
{
// ...
MigrateImages(record.Id, record.ImageCount);
}
}
public void MigrateImages(int recordId, int imageCount)
{
for (int i = 1; i <= imageCount; i++)
{
var legacyImageData = DownloadImage("the image url");
if (legacyImageData != null && legacyImageData.Length > 0)
{
// discard because we don't need the image id here, but it's used in other workflows
var _ = InsertImage(recordId, legacyImageData);
}
}
}
// This method can be used elsewhere, so the return of int is necessary and cannot be changed
public int InsertImage(int recordId, byte[] imageData)
{
var urls = UploadImage(imageData).Result;
return // method call to save image and return image ID
}
public async Task<(Uri LargeUri, Uri ThumbnailUri)> UploadImage(byte[] imageData)
{
byte[] largeData = ResizeImageToLarge(imageData);
byte[] thumbnailData = ResizeImageToThumbnail(imageData);
var largeUpload = largeBlob.UploadFromByteArrayAsync(largeImage, 0, largeImage.Length);
var thumbUpload = thumbsBlob.UploadFromByteArrayAsync(thumbImage, 0, thumbImage.Length);
await Task.WhenAll(largeUpload, thumbUpload);
var largeUrl = "";// logic to build url
var thumbUrl = "";// logic to build url
return (largeUrl, thumbUrl);
}
Я использую async / await для UploadImage()
, чтобы разрешить параллельную загрузку больших и миниатюрных изображений, экономя время.
Мой вопрос (если это возможно / делаетсмысл) как я могу использовать async / await для MigrateImages()
для параллельной загрузки изображений, чтобы сократить общее время, необходимое для выполнения задачи? Помогает ли моя цель тот факт, что я уже использую async / await в UploadImage()
?
Это может быть очевидно из-за моего вопроса, но await / async - это все еще то, что я не могу полностью обдумать, как исправить, использовать и / или реализовать его.