To może być bardzo głupie pytanie, ale mam następujące wiersze kodowania, które przekształcają obrazów RAW do BitmapImages:asynchroniczny Zadanie vs asynchronicznym pustce
public async void CreateImageThumbnails(string imagePath, int imgId)
{
await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath));
}
który wywołuje tę metodę 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;
}
Podczas korzystania z metody async Void
zamiast async Task
w mojej metodzie CreateImageThumbnails
moja aplikacja przetwarza obrazy (29 z nich) około 11 sekund szybciej niż async Task
. Dlaczego miałoby to być?
Wykorzystanie pamięci jest znacznie bardziej użyciu void
, ale operacja jest zakończona znacznie szybciej. Mam małą wiedzę na temat wątków, dlatego właśnie zadaję to pytanie. Czy ktoś może wyjaśnić, dlaczego tak się dzieje?
Również zrobiłem pewne badania na temat kiedy i kiedy nie używać async void
, ale nie mogłem znaleźć odpowiedzi na moje pytanie. (Mogłem po prostu nie przeszukiwać bardzo dobrze).
Dziękuję.
Może to pomoże: https://stackoverflow.com/questions/12144077 –
'async void' to ogień i zapomnij, więc nic nie śledzi operacji asynchronicznej (lub nawet upewnia się, że działa całkowicie), podczas gdy' async Zadanie "faktycznie utrzymuje ścieżkę, na którą można czekać. – poke
Czy oczekujesz na zadanie, gdy używasz zadania? – Magnus