[英]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;
}
在我的CreateImageThumbnails
方法中使用async Void
而不是async Task
時,我的應用程序處理圖像(其中 29 個)比async Task
快約 11 秒。 為什么會這樣?
使用void
占用的內存更多,但操作完成得更快。 我對線程知之甚少,這就是我問這個問題的原因。 有人可以解釋為什么會這樣嗎?
此外,我對何時以及何時不使用async void
進行了一些研究,但我找不到我的問題的答案。 (我可能只是沒有很好地搜索)。
謝謝。
當您調用async void
方法,或在不等待的情況下調用async Task
方法(如果被調用的方法包含await
,則它不會阻塞),您的代碼將立即繼續,無需等待該方法實際完成。 這意味着該方法的多個調用可以並行執行,但您不知道它們何時真正完成,而您通常需要知道這一點。
您可以像這樣利用並行執行,同時還可以通過將Task
存儲在集合中然后使用await Task.WhenAll(tasks);
來等待所有調用完成await Task.WhenAll(tasks);
.
還要記住,如果你想並行執行代碼,你必須確保這樣做是安全的。 這通常稱為“線程安全”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.