async Task vs async void

Это может быть очень глупый вопрос, но у меня есть следующие строки кодирования, которые конвертируют RAW-изображения в BitmapImages:

public async void CreateImageThumbnails(string imagePath, int imgId) { await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath)); } 

который вызывает этот метод CreateThumbnail()

 public static BitmapImage CreateThumbnail(string imagePath) { var bitmap = new BitmapImage(); using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) { bitmap.BeginInit(); bitmap.DecodePixelWidth = 283; bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.StreamSource = stream; bitmap.EndInit(); } bitmap.Freeze(); GC.WaitForPendingFinalizers(); GC.Collect(); return bitmap; } 

При использовании async Void вместо async Task в моем методе CreateImageThumbnails мое приложение обрабатывает изображения (29 из них) примерно на 11 секунд быстрее, чем async Task . Почему это должно быть?

asynchronous асинхронный

асинхронная задача асинхронная задача

Использование памяти гораздо больше использует void , но операция выполняется намного быстрее. У меня мало знаний о streamовом, вот почему я задаю этот вопрос. Может кто-нибудь объяснить, почему это происходит?

Кроме того, я провел некоторое исследование о том, когда и когда не использовать async void , но я не смог найти ответ на мой вопрос. (Я бы просто не очень хорошо обыскал).

Спасибо.

    Когда вы вызываете метод async void или вызываете метод async Task без его ожиданий, ваш код будет продолжать действовать сразу, не дожидаясь завершения метода. Это означает, что несколько вызовов метода могут выполняться параллельно , но вы не будете знать, когда они действительно завершатся, что вам обычно нужно знать.

    Вы можете воспользоваться параллельным выполнением этого процесса, а также быть в состоянии дождаться завершения всех вызовов, сохраняя await Task.WhenAll(tasks); s в коллекции, а затем использовать await Task.WhenAll(tasks); ,

    Также имейте в виду, что если вы хотите параллельно выполнять код, вы должны убедиться, что это безопасно. Это обычно называют «безопасностью streamа».