private void StartTasksForImageAsync(
MediaImage mediaImage,
Stream fileStream,
MemoryStream thumbnailFileStream,
bool shouldNotUploadOriginal = false)
{
var allTasks = new List<Task>();
var publicImageUpload = mediaFileService.UploadMediaFileToStorageAsync<MediaImage>(
fileStream,
mediaImage.FileUri,
mediaImage.Id,
(img, session) =>
{
if (img != null)
{
img.IsUploaded = true;
}
},
img =>
{
if (img != null)
{
img.IsUploaded = false;
}
},
true);
allTasks.Add(publicImageUpload);
var publicThumbnailUpload = mediaFileService.UploadMediaFileToStorageAsync<MediaImage>(
thumbnailFileStream,
mediaImage.ThumbnailUri,
mediaImage.Id,
(img, session) =>
{
if (img != null)
{
img.IsThumbnailUploaded = true;
}
},
img =>
{
if (img != null)
{
img.IsThumbnailUploaded = false;
}
},
true);
allTasks.Add(publicThumbnailUpload);
Task publicOriginalUpload = null;
if (!shouldNotUploadOriginal)
{
publicOriginalUpload = mediaFileService.UploadMediaFileToStorageAsync<MediaImage>(
fileStream,
mediaImage.OriginalUri,
mediaImage.Id,
(img, session) =>
{
if (img != null)
{
img.IsOriginalUploaded = true;
}
},
img =>
{
if (img != null)
{
img.IsOriginalUploaded = false;
}
},
true);
allTasks.Add(publicOriginalUpload);
}
allTasks.ForEach(task => task.ContinueWith((t) => { Log.Error("Error observed while executing parallel task during image upload.", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted));
Task.Factory.ContinueWhenAll(
allTasks.ToArray(),
result =>
{
try
{
ExecuteActionOnThreadSeparatedSessionWithNoConcurrencyTracking(
session =>
{
var media = session.Get<MediaImage>(mediaImage.Id);
if (media != null)
{
OnAfterUploadCompleted(media, shouldNotUploadOriginal);
}
});
}
catch (Exception ex)
{
Log.Error("Failed to finalize upload.", ex);
}
});
publicImageUpload.Start();
if (publicOriginalUpload != null)
{
publicOriginalUpload.Start();
}
if (publicThumbnailUpload != null)
{
publicThumbnailUpload.Start();
}
}